Activiti新手常见的问题是,部署成功流程后,获取显示的流程图片(PNG)为乱码,主要体现为中文无法正确显示。在这里分析一下乱码出现的原因,以及解决方案。不喜欢问为什么的同学可以直接跳到解决方法段落。

表现

Activiti流程图乱码常见有两种情况:

所有中文字符变成方块

所有中文字符变成无意义汉字

造成这两种情况的错误原因以及解决方法并不相同,但都与Activiti部署、生成流程图的方法有关。下面先介绍Activiti的流程图生成方式。

背景介绍

Activiti中,使用的流程定义一般都是符合BPMN2.0标准的xml文本文件,后缀可以是.bpmn20.xml,.xml。其中包含了流程的全部定义内容,包括各节点、节点关联关系,以及用于定义显示的DI元素。

在部署流程定义时,Activiti引擎会判断,是否同时提供了流程图文件?如果一起提供了流程图文件,Activiti就省事了,直接使用这个文件作为流程图。

一般来说我们都不会先制作好流程图文件再部署,也就是说,部署时只有一个xml文件。这时候Activiti就需要自己生成对应的流程图文件了。

流程图文件会保存在Activiti的数据库ACT_GE_BYTEARRAY表中,作为BLOB保存。每个流程对应一个流程图文件。所以流程图在部署时就已经确定,除非重新部署或手动处理,否则不管配置怎么修改,显示的都是最初的流程图。

Activiti用于生成流程图的工具类是

org.activiti.image.impl.DefaultProcessDiagramGenerator

这个类不止可以生成流程图,还可以生成流程运行状态图。具体可以参阅其中各方法的注释。

出错原因分析

中文字符变成方块

在部署流程时,生成流程图的代码位于

org.activiti.engine.impl.bpmn.deployer.BpmnDeployer.deploy():154 (Activiti 5.22中)

byte[] diagramBytes = IoUtil.readInputStream(processEngineConfiguration.

getProcessDiagramGenerator().generateDiagram(bpmnParse.getBpmnModel(), "png", processEngineConfiguration.getActivityFontName(),

processEngineConfiguration.getLabelFontName(),processEngineConfiguration.getAnnotationFontName(), processEngineConfiguration.getClassLoader()), null);

可见在这里,需要在processEngineConfiguration里,保存有正确的LabelFontName,以及AnnotationFontName作为参数,Generator才能正确生成(非英文)的流程图片。

中文字符变成无意义汉字

出现这种问题,基本上都是在Activiti提供的demo程序——Explorer中设计、部署流程的时候出现的。原因是demo程序有bug。

Activiti Explorer中提供的Activiti Modeler,是一个Web流程设计器。用于编辑、保存流程模型。这里请注意,不能用于新建,它生成的也只是流程模型,不是流程定义。生成的流程模型是Json格式的,也保存在ACT_GE_BYTEARRAY表中。

然后在Activiti Explorer中提供了“部署”的操作。对应的代码为(Activiti 5.22中)(实际有两个部署方式,不过画线部署的是这个。另一个是填表单方式部署,问题类似)

org.activiti.editor.ui.EditorProcessDefinitionDetailPanel.deployModelerModel()

protected void deployModelerModel(final ObjectNode modelNode) {

BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode);

byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(model);

String processName = modelData.getName() + ".bpmn20.xml";

Deployment deployment = repositoryService.createDeployment()

.name(modelData.getName())

.addString(processName, new String(bpmnBytes))

.deploy();

ExplorerApp.get().getViewManager().showDeploymentPage(deployment.getId());

}

大意是,将Modeler的数据格式(Json modelNode),转换为Activiti内部交换格式(BpmnModel model),再转成xmlbyte(byte[] bpmnBytes),然后在部署的时候再作为String加入部署

.addString(processName, new String(bpmnBytes))

很绕是不是?Activiti的开发者也把自己绕晕了,导致这里出现了bug。

public byte[] convertToXML(BpmnModel model) {

return convertToXML(model, DEFAULT_ENCODING);

}

转换为xmlbyte的方法里,指定了编码方式(为UTF-8)。但是再转回字符串的时候,却没有指定编码方式!

new String(bpmnBytes)

在未指定编码方式的时候,new String使用jvm定义的默认编码方式解析,而我们一般使用的都是gb2312,因此导致问题。

解决方法

再次强调,修改之后,需要重新部署或手动生成流程图片,才能看到效果!

中文字符变成方块

在Activiti的配置中,加上字体配置即可。

对于Spring用户,在Spring配置文件中找到Activiti流程引擎定义的地方

...

在其中加上几个参数(按照Activiti的版本不同,参数数量不一定。用IDE提示,把所有带有font的都设置上就好了)。字体可以按照喜好设置,但需要保证tomcat运行时可以找到(例如默认安装的linux服务器很可能就没有)。

重启tomcat使配置生效,重新部署流程以重新生成流程图。方块字就ok啦。

中文字符变成无意义汉字

由于问题出在编码方式上,因此有几种修改方式

1. 修改jvm默认参数。

在tomcat的vm运行参数上,加上-Dfile.encoding=UTF-8。不过副作用是导致整个项目都运行在utf-8下,对于写的不严谨的项目,可能导致其它地方默认使用gb2312编码的代码出错。

2. 修改Explorer部署部分的代码

将org.activiti.editor.ui.EditorProcessDefinitionDetailPanel.deployModelerModel():348

修改为.addString(processName, new String(bpmnBytes, "UTF-8"))即可。

可以直接修改activiti的源码,编译后使用。

也可以在自己的项目下,手动创建org.activiti.editor.ui.EditorProcessDefinitionDetailPanel类,把Activiti的源码贴进去,再修改正确。这样我们重写的类就会由classloader优先加载,覆盖Activiti自己的实现,达到修改的目的。

3. 说到底Explorer只是Activiti提供的demo样例。自己写的时候,可以参考Explorer的代码,可别直接拿来用哦。

显示字符为空白

这个严格来说并不是“乱码”,解决方法也很简单:画流程图的时候,少写几个字,或者把框框拖动搞大一点就可以了~

activiti 启动tomcat乱码_Activiti 流程图片显示乱码问题分析与解决相关推荐

  1. linux文件乱码crt,Linux中文文件显示乱码或Secure CRT显示乱码解决方案

    Linux中文文件显示乱码或Secure CRT显示乱码解决方案 1.设置Secure CRT options->session options->appearance->fond( ...

  2. vue页面渲染(请求返回的后端)data,文本换行与显示bug 的分析与解决提示

    vue页面渲染(请求返回的后端)data,文本换行与显示bug 的分析与解决提示 问题说明: vue项目,后台一经修改文案[介绍内容]后,前端接收显示实时数据,却无法换行? 原因分析: 后台页面的表单 ...

  3. tomcat服务器cpu占用率居高不下的原因分析及解决

    tomcat服务器cpu占用率居高不下的原因分析及解决 偶遇服务器cpu飙升,过段时间后正常,反反复复 获取cpu占用高的java进程运行中的堆栈信息 偶遇服务器cpu飙升,过段时间后正常,反反复复 ...

  4. win8以上windows系统eclipse环境下图片显示乱码问题解决

    相信升级了win10系统的诸多安卓开发者在用eclipse时会发现一个很不爽的地方,就是原本win7环境下能正常打开的图片文件现在成了一页乱码,我曾多次碰到这个问题,在网上也很难找到行之有效的具体解决 ...

  5. xampp运行php中文乱码,dvwa+xampp搭建显示乱码的问题及解决方案

    如图,dvwa显示乱码,解决办法有两个: 1.方法一是,临时解决办法,也就是每次都得手动修改:利用浏览器的编码修改 2.方法二是:永久方案,那就是修改dvwa的配置文件,修改默认编码,位置在(记得打开 ...

  6. xampp浏览php出现乱码,dvwa+xampp搭建显示乱码的问题及解决方案

    如图,dvwa显示乱码,解决办法有两个: 1.方法一是,临时解决办法,也就是每次都得手动修改:利用浏览器的编码修改 2.方法二是:永久方案,那就是修改dvwa的配置文件,修改默认编码,位置在(记得打开 ...

  7. mysql的中文乱码url,MySQL 中文显示乱码

    MySQL 中文显示乱码 MySQL 中文显示乱码 如果你遇到乱码问题,可以从下面几个问题逐步检查: (1)检查你的文件存储编码是否和 meta 声明的一致,假如你的文件是按照 utf-8 编码存储, ...

  8. linux oracle显示乱码,Linux下oracle显示乱码解决

    1.登录oracle用户,登录dba,显示乱码??? [root@redhat4 ~]# su - oracle [oracle@redhat4 ~]$ sqlplus / as sysdba SQL ...

  9. 计算机网络共享名称乱码,电脑wifi名称显示乱码怎么回事

    现如今生活还是办公都离不开wifi设备,电脑连接WiFi就可以轻松上网了,近期,很多网友遇到一个奇怪的问题,电脑正要连接wifi的时候发现名称显示乱码,不敢随意进行连接,是不是WiFi出现什么问题?针 ...

  10. neovim图标显示乱码,utf8字体显示乱码(Windows10和Centos安装nerd-fonts)

    前言 作为一名想成为大神的菜鸟程序员,一个牛X的代码编辑环境是必不可少的,在这里我推荐neovim和emacs.我使用的是neovim,github上有neovim-from-scratch工程可以一 ...

最新文章

  1. python 人脸识别_手把手教你用python实现人脸识别,识别率高达99.38%
  2. 批量导入sql文件。
  3. 浅析Java的“克隆”方法[zt]
  4. jdbc详解:1、创建数据库connection连接
  5. xBIM(eXtensible Building Information Modelling)可扩展的建筑信息模型
  6. 您正在使用什么垃圾收集器?
  7. 制图折断线_CAD制图初学入门之CAD标注时必须要区分的两个概念
  8. java调用exe_Windows系统中Java调用cmd命令及执行exe程序的方法
  9. ai面试的优缺点_面试也能开“外挂”?领英AI做了什么
  10. JS对于JSON的增删改查操作
  11. linux 重启21端口命令,修改SSH默认远程端口为21号端口
  12. 程序员生存定律——打造属于自己的稀缺性(转载)
  13. consul服务发现与注册于配置 (mac版为例)
  14. 链塔区块链数据平台周报:新增富豪榜、项目点评、收藏等功能 | 链塔数据
  15. 【计算机视觉】不来试试图片轮廓提取?
  16. 降低网络运维管理成本技巧分析
  17. CF #768 F.Flipping Range
  18. display和visility
  19. 退完押金要200年的途歌,是怎么把自己玩儿坏的?
  20. 理工男你要懂爱,女朋友不会从天上掉下来 | 钛空精分小剧场

热门文章

  1. 有趣的东西:Test () () () () () () () () () ();
  2. java 线程 interrupted_Java:当被另一个线程中断时,如何在线程上捕获InterruptedException?...
  3. 会扫地炒菜,将来机器人当钟点工
  4. android -------- 打开本地浏览器或指定浏览器加载,打电话,打开第三方app
  5. 数百亿的新疆安防市场,集成巨头告诉你如何才能从中分杯羹
  6. 编写可靠shell脚本的8个建议
  7. MVC渲染文章内容的html标签转义
  8. 第一章 Shell基础知识
  9. arcengine开发中遇到的错误汇总
  10. 09年网络工程师考试大纲