在ACTIVITI 5.15的版本中,有一個設置流程圖的字體配置。
配置如下:
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration"> <property name="dataSource" ref="dataSource" /> <property name="databaseType" value="${jdbc.dbType}" /> <property name="dbIdentityUsed" value="false" /> <property name="history" value="audit" /> <property name="transactionManager" ref="transactionManager" /> <property name="databaseSchemaUpdate" value="true" /> <property name="jobExecutorActivate" value="false" /> <property name="idGenerator" ref="activitiIdGenerator" /> <property name="processDefinitionCache"> <bean class="com.hotent.bpmx.activiti.cache.ActivitiDefCache"></bean> </property> <property name="labelFontName" value="宋體"></property> <property name="activityFontName" value="宋體"></property> </bean>
但是我通過代碼生成流程圖時,發現配置無效。
BpmnModel bpmnModel= repositoryService.getBpmnModel("流程定義ID");
InputStream inputStream= ProcessDiagramGenerator.generatePngDiagram(bpmnModel);
這樣生成的流程圖中是中文出現亂碼。
跟蹤了一下:
發現ProcessDiagramCanvas代碼中的ProcessEngineConfiguration conf=Context.getProcessEngineConfiguration(); 這個配置為空,那么這個配置當然是無效的了。
如果單純解決這個問題很好辦直接修改代碼:
protected String activityFontName = "宋體";
protected String labelFontName = "宋體";
就可以了。
但是需要我們需要解決的是為什么獲取這個流程配置為空的問題,讓流程配置文件生效。
分析原因:
為什么這個Context.getProcessEngineConfiguration();獲取為空呢,這個是這樣,這個需要有值的話,是需要經過activiti的攔截器的。
我使用上面代碼生成的時候,那么他就不會經過他的攔截器了,那么這個獲取的這個值一定為空。
解決方法:
我們讓這個代碼在流程引擎的攔截器下執行。
在activiti中可以使用命令的方式執行代碼。
具體做法如下:
1.實現類讓他注入commandExecutor。
public class BaseServiceImpl extends ServiceImpl implements InitializingBean { @Resource ProcessEngine processEngine; @Override public void afterPropertiesSet() throws Exception { ProcessEngineImpl engine = (ProcessEngineImpl)processEngine; this.setCommandExecutor(engine.getProcessEngineConfiguration().getCommandExecutor()); } }
2.定義一個cmd生成流程圖。
public class GenFlowImageCmd implements Command<InputStream> { private String bpmnDefId=""; public GenFlowImageCmd(String bpmnDefId){ this.bpmnDefId=bpmnDefId; } @Override public InputStream execute(CommandContext context) { RepositoryService repositoryService=(RepositoryService) AppUtil.getBean("repositoryService"); BpmnModel bpmnModel= repositoryService.getBpmnModel(bpmnDefId); InputStream inputStream= ProcessDiagramGenerator.generatePngDiagram(bpmnModel); return inputStream; } }
3.調用這個cmd。
實現一個類繼承BaseServiceImpl 。
public class FlowImageService extends BaseServiceImpl { public InputStream getProcessImage(String bpmnDefId){ InputStream inputStream= this.commandExecutor.execute(new GenFlowImageCmd(bpmnDefId)); return inputStream; } }
在spring文件中配置這個service,這樣再次調用生成代碼,那么就可以讀取到配置的數據了。
