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

  • 相关阅读:
    规约先行-(六)并发处理
    MySQL选择合适的方式存储时间
    规约先行-(五)集合处理
    规约先行-(四)OOP 规约
    12.20-LaTex git workflow
    6.25-ROS 软件度量
    6.19-rosdoc_lite and 文档构建工具
    12.27-ros-decision making
    12.3-分级并发有限状态机-SMACH
    12.07-rostest学习
  • 原文地址:https://www.cnblogs.com/yg_zhang/p/3668310.html
Copyright © 2011-2022 走看看