activiti 启动tomcat乱码_Activiti 流程图片显示乱码问题分析与解决
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 流程图片显示乱码问题分析与解决相关推荐
- linux文件乱码crt,Linux中文文件显示乱码或Secure CRT显示乱码解决方案
Linux中文文件显示乱码或Secure CRT显示乱码解决方案 1.设置Secure CRT options->session options->appearance->fond( ...
- vue页面渲染(请求返回的后端)data,文本换行与显示bug 的分析与解决提示
vue页面渲染(请求返回的后端)data,文本换行与显示bug 的分析与解决提示 问题说明: vue项目,后台一经修改文案[介绍内容]后,前端接收显示实时数据,却无法换行? 原因分析: 后台页面的表单 ...
- tomcat服务器cpu占用率居高不下的原因分析及解决
tomcat服务器cpu占用率居高不下的原因分析及解决 偶遇服务器cpu飙升,过段时间后正常,反反复复 获取cpu占用高的java进程运行中的堆栈信息 偶遇服务器cpu飙升,过段时间后正常,反反复复 ...
- win8以上windows系统eclipse环境下图片显示乱码问题解决
相信升级了win10系统的诸多安卓开发者在用eclipse时会发现一个很不爽的地方,就是原本win7环境下能正常打开的图片文件现在成了一页乱码,我曾多次碰到这个问题,在网上也很难找到行之有效的具体解决 ...
- xampp运行php中文乱码,dvwa+xampp搭建显示乱码的问题及解决方案
如图,dvwa显示乱码,解决办法有两个: 1.方法一是,临时解决办法,也就是每次都得手动修改:利用浏览器的编码修改 2.方法二是:永久方案,那就是修改dvwa的配置文件,修改默认编码,位置在(记得打开 ...
- xampp浏览php出现乱码,dvwa+xampp搭建显示乱码的问题及解决方案
如图,dvwa显示乱码,解决办法有两个: 1.方法一是,临时解决办法,也就是每次都得手动修改:利用浏览器的编码修改 2.方法二是:永久方案,那就是修改dvwa的配置文件,修改默认编码,位置在(记得打开 ...
- mysql的中文乱码url,MySQL 中文显示乱码
MySQL 中文显示乱码 MySQL 中文显示乱码 如果你遇到乱码问题,可以从下面几个问题逐步检查: (1)检查你的文件存储编码是否和 meta 声明的一致,假如你的文件是按照 utf-8 编码存储, ...
- linux oracle显示乱码,Linux下oracle显示乱码解决
1.登录oracle用户,登录dba,显示乱码??? [root@redhat4 ~]# su - oracle [oracle@redhat4 ~]$ sqlplus / as sysdba SQL ...
- 计算机网络共享名称乱码,电脑wifi名称显示乱码怎么回事
现如今生活还是办公都离不开wifi设备,电脑连接WiFi就可以轻松上网了,近期,很多网友遇到一个奇怪的问题,电脑正要连接wifi的时候发现名称显示乱码,不敢随意进行连接,是不是WiFi出现什么问题?针 ...
- neovim图标显示乱码,utf8字体显示乱码(Windows10和Centos安装nerd-fonts)
前言 作为一名想成为大神的菜鸟程序员,一个牛X的代码编辑环境是必不可少的,在这里我推荐neovim和emacs.我使用的是neovim,github上有neovim-from-scratch工程可以一 ...
最新文章
- python 人脸识别_手把手教你用python实现人脸识别,识别率高达99.38%
- 批量导入sql文件。
- 浅析Java的“克隆”方法[zt]
- jdbc详解:1、创建数据库connection连接
- xBIM(eXtensible Building Information Modelling)可扩展的建筑信息模型
- 您正在使用什么垃圾收集器?
- 制图折断线_CAD制图初学入门之CAD标注时必须要区分的两个概念
- java调用exe_Windows系统中Java调用cmd命令及执行exe程序的方法
- ai面试的优缺点_面试也能开“外挂”?领英AI做了什么
- JS对于JSON的增删改查操作
- linux 重启21端口命令,修改SSH默认远程端口为21号端口
- 程序员生存定律——打造属于自己的稀缺性(转载)
- consul服务发现与注册于配置 (mac版为例)
- 链塔区块链数据平台周报:新增富豪榜、项目点评、收藏等功能 | 链塔数据
- 【计算机视觉】不来试试图片轮廓提取?
- 降低网络运维管理成本技巧分析
- CF #768 F.Flipping Range
- display和visility
- 退完押金要200年的途歌,是怎么把自己玩儿坏的?
- 理工男你要懂爱,女朋友不会从天上掉下来 | 钛空精分小剧场
热门文章
- 有趣的东西:Test () () () () () () () () () ();
- java 线程 interrupted_Java:当被另一个线程中断时,如何在线程上捕获InterruptedException?...
- 会扫地炒菜,将来机器人当钟点工
- android -------- 打开本地浏览器或指定浏览器加载,打电话,打开第三方app
- 数百亿的新疆安防市场,集成巨头告诉你如何才能从中分杯羹
- 编写可靠shell脚本的8个建议
- MVC渲染文章内容的html标签转义
- 第一章 Shell基础知识
- arcengine开发中遇到的错误汇总
- 09年网络工程师考试大纲