流程图片显示乱码问题浅析与解决,MySql踩坑总计

By admin in 4858.com on 2019年1月17日

  前天配备了一下清晨的token,可是不了解怎么回事就是部署不成功,在网上找了多的章程也未曾缓解了这多少个问题,然而最终做在一个论坛上找到理解决的不二法门。真是激动的永不不要的,话不多说一向怼代码。

Activiti新手常见的题材是,部署成功流程后,获取显示的流程图片(PNG)为乱码,紧要反映为华语不可以正确呈现。在此间分析一下乱码出现的来由,以及解决方案。不喜欢问为何的同校可以一向跳到解决情势段落。

衣带渐宽终不悔,为伊消得人憔悴,众里寻他千百度,蓦然回首,那人却在灯火阑珊处好通顺的句子哈哈

一、验证统计机服务列表中是不是有MySQL服务

  这多少个是微信公众平台上的配备。

表现

Activiti流程图乱码常见有二种情景:

  1. 不无普通话字符变成方块
![](https://upload-images.jianshu.io/upload_images/4770110-6e2cda534300a7ad.png)
  1. 拥有普通话字符变成浮泛汉字
![](https://upload-images.jianshu.io/upload_images/4770110-a3f85b063efed71b.png)

以致这二种情况的一无是处原因以及解决措施并不相同,但都与Activiti部署、生成流程图的点子有关。下面先介绍Activiti的流程图生成情势。

转了那么多弯,才晓得问题就在一个地点。睡觉此前想精晓了问题,依然经验太少。王国维的治学三境界:

(1)右击桌面上的电脑图标现身菜单列表选项,选中管理(有多种办法得以打开电脑本地服务列表,这里只是用的自己习惯的打开格局)。

  4858.com 1

背景介绍

Activiti中,使用的流水线定义一般都是相符BPMN2.0专业的xml文本文件,后缀可以是.bpmn20.xml,.xml。其中含有了流程的任何概念内容,包括各节点、节点关联关系,以及用于定义呈现的DI元素。

在配置流程定义时,Activiti引擎会判断,是否还要提供了流程图文件?假如一起提供了流程图文件,Activiti就方便了,直接利用这多少个文件作为流程图。

相似的话我们都不会先打造好流程图文件再布局,也就是说,部署时唯有一个xml文件。这时候Activiti就需要团结生成对应的流程图文件了。

流程图文件会保存在Activiti的数据库ACT_GE_BYTEARRAY表中,作为BLOB保存。每个流程对应一个流程图文件。故此流程图在配备时就曾经规定,除非重新部署或手动处理,否则不管配置怎么修改,突显的都是早期的流程图。

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

org.activiti.image.impl.DefaultProcessDiagramGenerator

以此类不止可以生成流程图,还足以生成流程运行状态图。具体可以参见其中各艺术的注释。

明早大风凋碧树,独上高楼,望尽天涯路

衣带渐宽终不悔,为伊消得人憔悴

众里寻他千百度,蓦然回首,那人却在灯火阑珊处

4858.com 2

  这边的url值要直接点到文件上,不然不会成功.  

出错原因分析

4858.com 3

(2)出现总结机对话框,点击打开服务与应用程序中服务选项。

下一场后台的安装

华语字符变成方块

在安排流程时,生成流程图的代码位于

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才能科学生成(非英文)的流程图片。

[TOC]

4858.com 4

 1 <?php
 2 namespace app\weixin\controller;
 3 
 4 use think\Controller;
 5 
 6 define("TOKEN", "******");//这里要输入你的token值
 7 
 8 // $wechatObj = new wechatCallbackapiTest();
 9 
10 // $wechatObj->valid();
11 
12 class Wx2 extends Controller {
13     
14     public function index()  
15     {  
16         $echoStr = $_GET["echostr"];  
17   
18         //valid signature , option  
19         if($this->checkSignature()){  
20             ob_clean(); //丢弃缓存中的内容
21             echo $echoStr;  
22             exit;  
23         }  
24     }  
25   
26     public function responseMsg()  
27     {  
28         //get post data, May be due to the different environments  
29         $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];  
30   
31         //extract post data  
32         if (!empty($postStr)){  
33                   
34                 $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);  
35                 $fromUsername = $postObj->FromUserName;  
36                 $toUsername = $postObj->ToUserName;  
37                 $keyword = trim($postObj->Content);  
38                 $time = time();  
39                 $textTpl = "<xml>  
40                             <ToUserName><![CDATA[%s]]></ToUserName>  
41                             <FromUserName><![CDATA[%s]]></FromUserName>  
42                             <CreateTime>%s</CreateTime>  
43                             <MsgType><![CDATA[%s]]></MsgType>  
44                             <Content><![CDATA[%s]]></Content>  
45                             <FuncFlag>0</FuncFlag>  
46                             </xml>";               
47                 if(!empty( $keyword ))  
48                 {  
49                     $msgType = "text";  
50                     $contentStr = "Welcome to wechat world!";  
51                     $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);  
52                     echo $resultStr;  
53                 }else{  
54                     echo "Input something...";  
55                 }  
56   
57         }else {  
58             echo "";  
59             exit;  
60         }  
61     }  
62           
63     private function checkSignature()  
64     {  
65         $signature = $_GET["signature"];  
66         $timestamp = $_GET["timestamp"];  
67         $nonce = $_GET["nonce"];      
68                   
69         $token = TOKEN;  
70         $tmpArr = array($token, $timestamp, $nonce);  
71         sort($tmpArr,SORT_STRING); 72         $tmpStr = implode( $tmpArr );  
73         $tmpStr = sha1( $tmpStr );  
74           
75         if( $tmpStr == $signature ){  
76             return true;  
77         }else{  
78             return false;  
79         }  
80     }
81 
82 
83 }
华语字符变成浮泛汉字

出现这种题材,基本上都是在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,因而导致问题。

数据源配置的题目

切切实实可以看
流程图片显示乱码问题浅析与解决,MySql踩坑总计。这里

本地连接可以,连接受服务器就是那多少个,愣是不行。我刚起始觉得是“APPARENT
DEADLOCK!!!”的题目,各个google方法,试了几回依然非凡。都快绝望了,早上体育场馆也在试仍旧不曾解决。早上睡觉的时候猛然想起来,我MyEclipse好像屏蔽掉了有着往外的连日,( ̄▽ ̄;),真是搬起石头砸自己的脚,给自己设置障碍。深夜一来,将连续放手,好题材化解。贴一下DBCP数据源的配置

#数据库驱动
driverClassName=com.mysql.jdbc.Driver
#数据库连接地址
url=jdbc:mysql://服务器地址:3306/dbWaterColInfo
#用户名
username=root
#密码
password=root

#连接池的最大数据库连接数。设为0表示无限制
maxActive=30
#最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连
#接将被标记为不可用,然后被释放。设为0表示无限制
maxIdle=10
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制
maxWait=1000

#超过removeAbandonedTimeout时间后,是否进 行没用连接(废弃)的回收(默认为false,调整为true) 
removeAbandoned=true
#超过时间限制,回收没有用(废弃)的连接(默认为 300秒,调整为180)
removeAbandonedTimeout=180

//DBCP管理类,也是从网上找的
package com.kuiblog.utils;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class DBCPManager {
    private static final Log log = LogFactory.getLog(DBCPManager.class);
    private static final String configFile = "这里替换成你的实际配置文件";

    private static DataSource dataSource;

    static {
        Properties dbProperties = new Properties();
        try {
            dbProperties.load(DBCPManager.class.getClassLoader()
                    .getResourceAsStream(configFile));
            dataSource = BasicDataSourceFactory.createDataSource(dbProperties);

            Connection conn = getConn();
            DatabaseMetaData mdm = conn.getMetaData();
            log.info("Connected to " + mdm.getDatabaseProductName() + " "
                    + mdm.getDatabaseProductVersion());
            if (conn != null) {
                conn.close();
            }
        } catch (Exception e) {
            log.error("初始化连接池失败:" + e);
        }
    }

    private DBCPManager(){

    }
    /**
     * 获取链接,用完后记得关闭
     * 
     * @see {@link DBManager#closeConn(Connection)}
     * @return
     */
    public static final Connection getConn() {
        Connection conn = null;
        try {
            conn = dataSource.getConnection();
        } catch (SQLException e) {
            log.error("获取数据库连接失败:" + e);
        }
        return conn;
    }

    /**
     * 关闭连接
     * 
     * @param conn
     *            需要关闭的连接
     */
    public static void closeConn(Connection conn) {
        try {
            if (conn != null && !conn.isClosed()) {
                conn.setAutoCommit(true);
                conn.close();
            }
        } catch (SQLException e) {
            log.error("关闭数据库连接失败:" + e);
        }
    }
}

行使DBCP需要导入多少个包加一个log包。commons-dbcpcommons-poolcommons-logging

接下来就足以放心大胆的使用了

(3)在右手的劳务列表中检索是否著名称为MySQL的劳动,并且查看是否启动,这表达我们设置MySQL服务一度成功。

  即使这种情势也分外的,只有修改编码形式来举办了,修改编码格局在网上有众多,自己无论一物色就出去,

解决办法

双重强调,修改之后,需要重新部署或手动生成流程图片,才能观望效果!

数据库编码问题

在产出数据库编码问题从前自己还遭遇了一个小题目,这就是自我透过DBUtils操作数据库,执行SELECT * FROM userInfos_t可以查询到具有的始末,然后参数化查询就万分,比如SELECT * FROM userInfos_t WHERE name='张三',但是SELECT * FROM userInfos_t WHERE id =2却足以,也是百思不得解,可以吗。也是数据库编码的题材。即便本人在Navicat for mysql中来看的是’张三’,但数据库编码形式并不是UTF8,所以自己搜寻是摸索不出去的。

  1. 第一查看数据库的字符集

show variables like 'collation_%';

4858.com 5

这是本身修改未来的,原先的都是latin1

  1. 网上涉及了成千上万缓解格局,一定要致密看。

    自我的Mysql版本是5.7,做了如下修改成功了

    修改/etc/mysql/my.cnf

    [client]
    default-character-set=utf8
    [mysqld]
    default-storage-engine=INNODB
    character-set-server=utf8
    collation-server=utf8_general_ci
    

    怎么找my.cnf

    locate my.cnf
    //如果找不到的话
    updatedb,//然后在查找
    

    重启Mysql服务

    service mysqld restart
    
也可以查看[这篇文章](http://www.pc6.com/infoview/article_63586.html)

来解决

总结
====

暂时的问题就这样多,用了`DBUtil`,没有用`Hibernate`,等以后学习学习再用。

### 文章首发于kuiblog.com。加油

若MySQL服务为自动启动,则证实大家的安排是打响的。

  前日就享受到这里,然后觉得自己写的正确性的请推荐,谢谢

华语字符变成方块

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

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

<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
    <property name="dataSource" ref="dataSource"/>
    <property name="transactionManager" ref="transactionManager"/>
    <property name="databaseSchemaUpdate" value="true"/>
    ...

在中间添加多少个参数(依照Activiti的版本不同,参数数量不必然。用IDE提醒,把具备带有font的都安装上就好了)。字体可以遵从喜好设置,但需要保证tomcat运行时可以找到(例如默认安装的linux服务器很可能就从不)。

<property name="activityFontName" value="宋体"/>
<property name="labelFontName" value="宋体"/>
<property name="annotationFontName" value="宋体"/>

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

4858.com 6

 

华语字符变成浮泛汉字

鉴于问题出在编码情势上,由此有二种修改章程

二、验证总结机Path环境变量是否配备有MySQL安装目录

1. 修改jvm默认参数。

在tomcat的vm运行参数上,加上-Dfile.encoding=UTF-8。然则副功用是促成整个项目都运作在utf-8下,对于写的不审慎的档次,可能造成其他地点默认使用gb2312编码的代码出错。

(1)右击桌面上的处理器图标出现菜单列表选项,选中属性。

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自己的实现,达到修改的目标。

4858.com 7

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

(2)在左手接纳高档系统设置。

凸显字符为空白

本条严酷来说并不是“乱码”,解决方法也很简短:画流程图的时候,少写多少个字,或者把范围拖动搞大一点就足以了~

4858.com 8

(3)在产出的体系性能对话框选拔环境变量。

4858.com 9

(4)在产出的环境变量对话框找到系统变量列表中的Path环境变量,点击编辑。

4858.com 10

(5)在编排系统变量Path的变量值中我们找到了C:\Program Files\MySQL\MySQL
Server 5.5\bin;这评释大家举行的布置MySQL服务已经打响。

4858.com 11

这和大家开展Java开发条件的安排或者蛮像的。

三、MySQL安装目录结构

4858.com ,在C盘中大家可以找到名称为MySQL的文本夹下的MySQL Server
5.5的公文夹,下面便是文本夹中的文件目录:

     
 4858.com 12

文件目录解释:

       (1)bin目录:存储可执行文件。

       (2)data目录:存储数据文件。

       (3)include目录:存储包含的头文件。

       (4)lib目录:存储库文件  。

       (5)share目录:错误消息和字符集文件。

       (6)此外后缀名为.ini的MySQL配置文件,最着重的就是My.ini配置文件。

四、设置MySQL的默认编码形式

     
 假若我们成功安装了MySQL,那么它默认的编码格局为latin1(拉丁),那并不相符我们所学习的的编码格局,由于我们习惯用的编码模式为GBK
2312如故UTF-8,因而需要修改编码情势,在末端的创制数据库文件时大家会碰着相同的题目。

修改编码格局步骤:

(1)在MySQL目录(我的是C:\Program Files\MySQL\MySQL Server
5.5)中找到My.ini配置文件,双击打开它。

4858.com 13

(2)寻找在client下的:

       [mysql]

       default-character-set=latin1

       改为:

       [mysql]

       default-character-set=utf8

4858.com 14

(3)再一次寻找client下的:
       [mysqld]
       character-set-server=latin1
       改为:
       [mysqld]

       character-set-server=utf8

4858.com 15

(4)由于修改了MySQL的布置文件,因而需要再一次开动MySQL服务,配置文件的修改才能奏效。也足以右击MySQL服务重新启航。重新开动MySQL服务的措施有多种,也有命令行情势的再一次起动。

在此处大家并不会展开验证MySQL服务的默认编码形式,后边的随笔会有介绍,希望我们持续关注小编为我们整理的一名目繁多作品,不要错过哦!

您可能感兴趣的随笔:

  • php+mysql 实出现份验证代码
  • MySQL验证用户权限的方法
  • PureFTP借助MySQL实现用户身份验证的操作教程
  • MySQL中数据类型的辨证
  • php+MySQL实现登录时验证登录名和密码是否科学
  • win7下MySql
    5.7装置配备模式图文教程
  • mysql
    5.7.30安装配备模式图文教程
  • MySQL安装配置模式教程
  • MySQL学习第一天
    第一次接触MySQL
  • MySQL学习第二天 安装和部署mysql
    winx64

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有