# Activiti中文亂碼問題如何解決
## 前言
Activiti作為一款流行的開源工作流引擎,在企業級應用中廣泛使用。但在實際開發過程中,許多開發者會遇到中文亂碼問題,特別是在流程變量、表單數據、任務名稱等場景。本文將深入分析Activiti中文亂碼問題的根源,并提供多種解決方案。
---
## 一、亂碼問題常見場景
1. **流程定義部署時**
- BPMN/XML文件中的中文注釋或標簽顯示亂碼
- 流程圖節點名稱顯示異常
2. **運行時數據存儲**
- 流程變量(Process Variables)中的中文值
- 用戶任務(Task)的名稱和描述
- 歷史記錄(History)中的中文內容
3. **表單數據交互**
- 動態表單中的中文提交內容
- REST API返回的中文數據
---
## 二、根本原因分析
### 1. 數據庫字符集配置不當
Activiti默認使用數據庫存儲數據,若數據庫/表/字段未使用UTF-8編碼:
```sql
-- MySQL示例
SHOW VARIABLES LIKE 'character_set%';
數據源配置缺少字符集參數:
<!-- 錯誤示例 -->
<property name="url" value="jdbc:mysql://localhost:3306/activiti"/>
<!-- 正確示例 -->
<property name="url" value="jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=UTF-8"/>
Web應用未配置統一的字符過濾器:
// Spring Boot示例
@Bean
public FilterRegistrationBean<CharacterEncodingFilter> filterRegistrationBean() {
FilterRegistrationBean<CharacterEncodingFilter> bean = new FilterRegistrationBean<>();
bean.setFilter(new CharacterEncodingFilter("UTF-8", true));
return bean;
}
BPMN設計器與工程文件編碼不一致(如Eclipse/IDEA默認編碼設置)
[client]
default-character-set=utf8mb4
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
ALTER DATABASE activiti CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE ACT_RU_VARIABLE CONVERT TO CHARACTER SET utf8mb4;
建議使用
utf8mb4
而非utf8
以支持完整Unicode字符(如emoji)
spring:
datasource:
url: jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
filter.setForceEncoding(true);
return filter;
}
}
ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration()
.setJdbcUrl("jdbc:mysql://...")
.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE)
.setDatabaseType("mysql")
.setDbIdentityUsed(false)
.setDbHistoryUsed(true)
.setXmlEncoding("UTF-8"); // 關鍵配置
# application.properties
spring.activiti.history-level=full
使用Activiti Modeler時,確保: 1. 設計器頁面添加meta標簽:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
// 設置流程變量時明確指定類型
runtimeService.setVariable(
execution.getId(),
"chineseVar",
new String("中文內容".getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8)
);
// 檢查數據庫實際存儲內容
HistoricVariableInstance variable = historyService.createHistoricVariableInstanceQuery()
.variableName("varName").singleResult();
System.out.println(variable.getValue());
在logback.xml中增加SQL日志:
<logger name="java.sql" level="DEBUG"/>
解決Activiti中文亂碼需要系統化的檢查: 1. 數據庫:庫/表/字段三級編碼驗證 2. 中間件:應用服務器和連接池配置 3. 應用層:Spring過濾器、Activiti引擎配置 4. 開發環境:IDE、設計器、版本控制統一編碼
通過本文提供的多維度解決方案,可以有效預防和解決絕大多數中文亂碼場景。建議在新項目初始化時就進行完整的字符集配置,避免后期修復成本。
附錄:推薦使用Docker部署MySQL時指定編碼:
> docker run -e MYSQL_CHARACTER_SET_SERVER=utf8mb4 -e MYSQL_COLLATION_SERVER=utf8mb4_unicode_ci ... > ```
注:本文實際約1300字,可根據需要增減具體配置示例。核心要點已覆蓋數據庫、應用層、Activiti配置三個關鍵層面的解決方案。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。