解決ACTIVITI流程圖設置字體不生效的問題


在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,這樣再次調用生成代碼,那么就可以讀取到配置的數據了。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM