• 解决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,这样再次调用生成代码,那么就可以读取到配置的数据了。

  • 相关阅读:
    vuex详解
    es6 数组方法的扩展
    es6class语法和继承
    变量的解构赋值
    es6变量let
    前端模块化
    webpack基础
    react中的redux(入门)
    react-router-dom中的BrowserRouter和HashRouter和link与Navlink
    react-router-dom
  • 原文地址:https://www.cnblogs.com/yg_zhang/p/3668310.html
Copyright © 2020-2023  润新知