当前位置: 首页 > 编程日记 > 正文

JBPM4常见错误汇总

1.在tomcat6.0下布署错误
   基于JBPM4的web项目jsp页面发布出错
现象:

javax.servlet.ServletException: java.lang.LinkageError: loader constraint violation: when resolving interface method "javax.servlet.jsp.JspApplicationContext.getExpressionFactory()Ljavax/el/ExpressionFactory;" the class loader (instance of org/apache/jasper/servlet/JasperLoader) of the current class, org/apache/jsp/OnDuty/wfmanage_jsp, and the class loader (instance of org/apache/catalina/loader/StandardClassLoader) for resolved class, javax/servlet/jsp/JspApplicationContext, have different Class objects for the type javax/el/ExpressionFactory used in the signature
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:
275)
javax.servlet.http.HttpServlet.service(HttpServlet.java:
717)
。。。


原因:
   项目中WEB-INF\lib中的三个jar包(juel.jar, juel-engine.jar, juel-impl.jar)和tomcat6下lib中jar包(el-api.jar)冲突

解决方法:
   方法一:换成tomcat5.5 一点问题也没有了
   方法二:将juel.jar, juel-engine.jar, juel-impl.jar这三个包复制到tomcat6下lib中,并删除原来的el-api.jar,切记要把WEB-INF\lib中的juel.jar, juel-engine.jar, juel-impl.jar删除。不然还是要冲突。 

2.无法保存(布署)含有中文的流程定义文件
现象:
保存流程定义文件

<?xml version="1.0" encoding="GBK"?>
<process name="leave" xmlns="http://jbpm.org/4.0/jpdl">
<start g="201,14,48,48" name="开始">
<transition g="-42,-10" name="请假" to="填写请假单"/>
</start>
...


提示错误:
   MalformedByteSequenceException:Invalid byte 1 of 1-byte UTF-8 sequence

原因:
   XML字符串大概经过了下面一些方法才被解析为DOM:

org.jbpm.pvm.internal.repository.DeploymentImpl:
public NewDeployment addResourceFromString(String resourceName, String text) {
addResourceFromStreamInput(resourceName,
new StringStreamInput(text));
return this;
}
public NewDeployment addResourceFromString(String resourceName, String text) {
addResourceFromStreamInput(resourceName,
new StringStreamInput(text));
return this;
}

org.jbpm.pvm.internal.stream.StringStreamInput:
public class StringStreamInput extends StreamInput {
String string;
public StringStreamInput(String string) {
this.name = "string";
this.string = string;
}
public InputStream openStream() {
byte[] bytes = string.getBytes();
return new ByteArrayInputStream(bytes);
}
}
public class StringStreamInput extends StreamInput {
String string;
public StringStreamInput(String string) {
this.name = "string";
this.string = string;
}
public InputStream openStream() {
byte[] bytes = string.getBytes();
return new ByteArrayInputStream(bytes);
}
}

org.jbpm.pvm.internal.xml.Parse:
protected InputSource getInputSource() {
if (inputSource!=null) {
return inputSource;
}
if (streamInput!=null) {
inputStream
= streamInput.openStream();
return new InputSource(inputStream);
}
addProblem(
"no source specified to parse");
return null;
}
protected InputSource getInputSource() {
if (inputSource!=null) {
return inputSource;
}
if (streamInput!=null) {
inputStream
= streamInput.openStream();
return new InputSource(inputStream);
}
addProblem(
"no source specified to parse");
return null;
}

org.jbpm.pvm.internal.xml.Parser:
protected Document buildDom(Parse parse) {
Document document
= null;
try {
SAXParser saxParser
= saxParserFactory.newSAXParser();
XMLReader xmlReader
= saxParser.getXMLReader();
// ...

InputSource inputSource
= parse.getInputSource();
xmlReader.parse(inputSource);

}
catch (Exception e) {
parse.addProblem(
"couldn't parse xml document", e);
}

return document;
}


   经过层层包装、拆包、再包装再拆包,可怜的字符串终于来到SAX解析器的手上。问题是jBPM在中间调用了String.getBytes():这个方法 会把Java字符串(Unicode)转换为系统默认编码并返回对应的byte[],但当InputSource中没有设置编码信息 时,SAXParser默认是以UTF-8编码来读取输入流的。我的开发机的系统默认编码是GBK,于是就出问题了。

解决方法:
   String xmlStr = "<?xml version=\"1.0\" encoding=\"" + System.getProperty("file.encoding") + "\"?><test name=\"名称\"></test>"
   这里就用System.getProperty("file.encoding")去获取系统默认编码,以便于String.getBytes()匹配。
   如果你能确保你的WEB服务器上运行的字符集是GBK,也可以写成

<?xml version="1.0" encoding="GBK"?>
<process name="leave" xmlns="http://jbpm.org/4.0/jpdl">
<start g="201,14,48,48" name="开始">
<transition g="-42,-10" name="请假" to="填写请假单"/>
</start>
...



3.无法保存(布署)含有中文的流程定义文件
现象:
   流程定义已经成功保存到数据库中,但无法执行,
   数据库表jbpm4_execution中的任务名称为乱码

原因:
   数据库中任务名称为乱码的根本原因不是hiberate保存到jbpm4_lob中的字段BLOB_VALUE造成的。而是JSP页面传递给servlet流程定义文本时,中文转码错误造成的。即servlet接收的即乱码。

解决方法
  1)JSP页面中显示中文乱码
     在JSP文件中使用page命令指定响应结果的MIME类型,如<%@ page language="java" contentType="text/html;charset=gbk" %>
  2)表单提交乱码   
    表单提交时(post和Get方法),使用request.getParameter方法得到乱码,这是因为tomcat处理提交的参数时默认的是iso-8859-1,表单提交get和post处理乱码问题不同,下面分别说明。
    (1)POST处理
    对post提交的表单通过编写一个过滤器的方法来解决,过滤器在用户提交的数据被处理之前被调用,可以在这里改变参数的编码方式,过滤器的代码如下:
Java代码

package example.util;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class SetCharacterEncodingFilter implements Filter {
protected String encoding = null;
protected FilterConfig filterConfig = null;
protected boolean ignore = true;

public void destroy() {
this.encoding = null;
this.filterConfig = null;
}

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
if (ignore || (request.getCharacterEncoding() == null)) {
String encoding
= selectEncoding(request);
if (encoding != null) {
request.setCharacterEncoding(encoding);
}
}

// Pass control on to the next filter
chain.doFilter(request, response);

}
public void init(FilterConfig filterConfig) throws ServletException {

this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
String value
= filterConfig.getInitParameter("ignore");
if (value == null) {
this.ignore = true;
}
else if (value.equalsIgnoreCase("true")) {
this.ignore = true;
}
else if (value.equalsIgnoreCase("yes")) {
this.ignore = true;
}
else {
this.ignore = false;
}

}

protected String selectEncoding(ServletRequest request) {

return (this.encoding);

}

}



web.xml文件加入过滤器

<filter>
<filter-name>Encoding</filter-name>
<filter-class>
example.util.SetCharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>gbk</param-value>
<!--gbk或者gb2312或者utf-8-->
</init-param>
<init-param>
<param-name>ignore</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Encoding</filter-name>
<servlet-name>/*</servlet-name>
</filter-mapping>



(2) Get方法的处理
 tomcat对post和get的处理方法不一样,所以过滤器不能解决get的乱码问题,它需要在其他地方设置。
 打开<tomcat_home>\conf目录下server.xml文件,找到对8080端口进行服务的Connector组件的设置部分,给这个组件添加一个属性:URIEncoding="GBK"。修改后的Connector设置为:
  

<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads
="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups
="false" redirectPort="8443" acceptCount="100"
connectionTimeout
="20000" disableUploadTimeout="true" URIEncoding="GBK" />


  * 注意修改后重新启动tomcat才能起作用。

4.运行出错时,数据库中的所有数据丢失
现象:
   运行出错后,数据库中的所有数据丢失,包括流程定义文件

原因:
   jbpm.hibernate.cfg.xml文件中有一个配置

<property name="hibernate.hbm2ddl.auto" value="create-drop"/>

几个参数的意思,我解释一下:
validate 加载hibernate时,验证创建数据库表结构
create 每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失的原因。
create-drop 加载hibernate时创建,退出是删除表结构
update 加载hibernate自动更新数据库结构
none 不进行任何操作



   由于jbpm4的默认配置为create-drop,所以出现以上问题

解决方法:
   将jbpm.hibernate.cfg.xml文件中修改如下

<property name="hibernate.hbm2ddl.auto" value="none"/>



5.在eclipse3.5流程设计器上设计流程时,中文出现乱码
现象:
   将流程设计好之后,点击保存,再查看代码,发现中文是乱码

原因:
   不清楚,应该是插件的bug

解决方法:
   将流程设计好之后,不要点保存,先将界面切换到代码窗口,这时可以看到中文,再点击保存

6.无法布署zip流程定义文件
现象:
   提示以下错误

streams type cannot be used in batching
2009-11-26 15:58:07 org.hibernate.event.def.AbstractFlushingEventListener performExecutions
严重: Could not synchronize database state with session
org.hibernate.exception.GenericJDBCException: could not insert: [org.jbpm.pvm.internal.lob.Lob]



原因:
   当把数据值增加超过100时,hiberate就出现了这个异常--这意味着Oracle JDBC不允许流操作以批量方式执行

解决方法:
   在jbpm.hibernate.cfg.xml文件的<session-factory>下,添加

<property name="hibernate.jdbc.batch_size">0</property>


   即可

7.无法布署zip流程定义文件
现象:
   提示错误

Could not synchronize database state with session
org.hibernate.exception.GenericJDBCException: could not insert: [org.jbpm.pvm.internal.lob.Lob]



原因:
   布署ZIP流程定义文件时hiberate无法插入blob
   用网络上提议的方法,添加以下配置

<property name="hibernate.jdbc.batch_size">0</property>
<property name="hibernate.jdbc.use_streams_for_binary">true</property>


   也不行

解决方法:
   采用以上方法,还是无法通过,最后重启操作系统,就解决了,奶奶的。

8.布署zip流程定义文件成功,但是数据库中中文为乱码
现象:

<?xml version="1.0" encoding="GBK"?>
<process name="leave" xmlns="http://jbpm.org/4.0/jpdl">
<start g="201,14,48,48" name="开始">
<transition g="-42,-10" name="请假" to="填写请假单"/>
</start>
...


   由于我的oracle9数据库格式为GBK,所以XML文件头为<?xml version="1.0" encoding="GBK"?>
   含有中文的流程定义zip文件已经成功保存到了blob字段内,但是中文名为乱码
   或者提示XML parse error,无法保存到数据库

原因:
   repositoryService.createDeployment().addResourcesFromZipInputStream(new ZipInputStream(item.getInputStream())).deploy();
   仅上面一句话,就不知道转了多少次编码,经过测试发现,还是编码方式的问题,最后决定将jbpm4.2的源代码复制到项目中来调试。

解决方法:
   在网上发现了这篇文章《Java中压缩与解压--中文文件名乱码解决办法》
   结果问题还是没有解决
   最后经过测试,将org.jbpm.pvm.internal.repository.DeploymentImpl类中的方法进行修改

public NewDeployment addResourcesFromZipInputStream(CnZipInputStream zipInputStream) {
try {
ZipEntry zipEntry
= zipInputStream.getNextEntry();
while(zipEntry!=null) {
String entryName
= zipEntry.getName();
byte[] bytes = IoUtil.readBytes(zipInputStream);

//如果是流程定义文件(不是图片),则重新编码,再生成字节数组
if(entryName.endsWith(".xml")){
String s
=new String(bytes,"utf-8");
bytes
=s.getBytes();
}

if (bytes!=null) {
addResourceFromStreamInput(entryName,
new ByteArrayStreamInput(bytes));
}
zipEntry
= zipInputStream.getNextEntry();
}
}
catch (Exception e) {
throw new JbpmException("couldn't read zip archive", e);
}
return this;
}


   问题解决,肯定是开始有一步编码方式是用UTF-8,中间你就是再怎么用GBK转码,都不会成功,这里先用UTF-8编码生成字符串,再转一次编码就成功了。

参考文献
1.dzq2008. JBPM4项目和tomcat6.0的兼容问题. http://dzq0371.javaeye.com/blog/509632
2.碰到jBPM的编码问题了. http://rednaxelafx.javaeye.com/blog/522436
3.如何解决Tomcat下中文乱码问题. http://www.javaeye.com/topic/251743?page=1
4.关于Hibernate一个配置参数hibernate.hbm2ddl.auto. http://linshiquan.javaeye.com/blog/263170

转载于:https://www.cnblogs.com/gaoyoubo/articles/1838090.html

相关文章:

Day 3 上午

内容提要&#xff1a; 动态规划 数位DP 树形DP 区间DP 动态规划 斐波那契数列f(0)0,f(1)1,......,f(n)f(n-1)f(n-2)0,1,1,2,3,5,8,13......他和动态规划有什么关系&#xff1f;首先&#xff0c;他有一个边界条件&#xff0c;就是f(0)0,f(1)1&#xff0c;相当于它不是从正无穷到…

SpringBoot------添加保存时自动编译插件

1.右键Java项目2.选择“Spring Tools”3.选择“Add Boot DevTools”4.每次使用Ctrl S键时就会自动编译了 实际上是在Pom.xml文件中添加了如下Java包 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring…

设置PLSQ 连接oracle数据库

1 、instantclient_12_1 的设置 配置文件内容 tnsnames.ora # tnsnames.ora Network Configuration File: C:\oracle\product\10.2.0\db_1\network\admin\tnsnames.ora # Generated by Oracle configuration tools.ORCL (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 221.…

《星辰变OL》估计很多人看过这书

瓜瓜小说论坛《星辰变OL》估计很多人看过这书&#xff0c;也估计很多人都不知道这游戏就快开始运行了。 本人2009-2010最期待的游戏了。 咩羊大大你千万注意下&#xff0c;这游戏一有封测&#xff0c;内测一类。一定要给我留个号。 下面看视频。 一定要给我留号啊~咩羊&#xf…

Ubuntu16.04 搭建nexus 私服 学习步骤以及安装maven和git

1、下载安装maven wget https://www-us.apache.org/dist/maven/maven-3/3.6.0/binaries/apache-maven-3.6.0-bin.tar.gz 1、创建maven仓库位置 2、修改setting.xml文件 添加东西如下 export M2_HOME/software/maven/apache-maven-3.6.0 export CLASSPATH$CLASSPATH:$M2_H…

Asp.net(C#)给图片加上水印效果(转自园上的Seven Eleven)

Asp.net(C#)给图片加上水印效果 private void Btn_Upload_Click(object sender, System.EventArgs e) { if(UploadFile.PostedFile.FileName.Trim()!"") { //上传文件 string extension Path.GetExten…

pip install失败报错解决方案

cmd pip install 某些包时报错 pip install Consider using the --user option or check the permissions. 只需要pip install --user package就可以解决转载于:https://www.cnblogs.com/webRobot/p/10799270.html

12.19冲刺总结

第二天冲刺&#xff1a; 昨天完成的任务&#xff1a; 主界面布局 遇到的问题&#xff1a; 登录界面弹窗 今日任务&#xff1a; 主界面编写转载于:https://www.cnblogs.com/mhj666/p/8349629.html

Win2003 防木马、权限设置、IIS服务器安全配置整理

原贴http://hi.baidu.com/zzxap/blog/item/18180000ff921516738b6564.html2009-02-10 10:45一、系统的安装   &#xff11;、按照Windows2003安装光盘的提示安装&#xff0c;默认情况下2003没有把IIS6.0安装在系统里面。&#xff12;、IIS6.0的安装开始菜单—>控制面板—&…

Js面试题(一)--js实现数组去重怎么实现?

方法1、创建一个新的临时数组来保存数组中已有的元素方法2、使用哈希表存储已有元素方法3、使用indexof判断数组元素第一次出现的位置是否为当前位置方法4、先排序再去重第一种方法和第三种方法都使用了indexof()&#xff0c;这个函数的执行机制也会遍历数组第二种使用了哈希表…

使用Maven 打包项目 生成XXX.tar.gz 文件

1、在项目中创建assembly文件夹 创建如图的一个assembly.xml文件 内容如下 <assemblyxmlns"http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"h…

整理了一下SQL Server里面可能经常会用到的日期格式转换方法

select getdate() 2004-09-12 11:06:08.177 举例如下: select CONVERT(varchar, getdate(), 120 ) 2004-09-12 11:06:08 select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),-,), ,),:,) 20040912110608 select CONVERT(varchar(12) , getdate(), 111 ) 2004/…

java使用Cookie判断用户登录情况

1.判断是否登录 public boolean isLogin() {Set<Cookie> cookies this.browser.getCookies();String JSESSIONIDID "JSESSIONID";String sessionIdID "sessionId";String loginID "login";String JSESSIONIDIDValue "";Str…

桌面菜单背景修改

只能修改资源管理器里的右键菜单&#xff0c;即桌面、文件夹和各种文件上的右键菜单&#xff0c;其它如标题栏和任务栏的是没效果的&#xff0c;可惜了。修改其实只是注册了一个dll文件&#xff0c;然后修改这个dll里面的背景图片就可以了。1.首先下载ContextBG.dll。2.然后下载…

全浏览器兼容的DIV拖动效果

测试过下列浏览器 IE6、IE7、IE8、Chrome 5、FF 3.6、Opera 10、Safari 5 拖动效果的脚本网上都有&#xff0c;但网上找到的脚本有个问题 这是在网上随便找的代码(原出处不知道&#xff0c;很多类似代码的文章都没写出处&#xff0c;实在不知道到底出至哪里...) 代码 1 <!DO…

SpringSecurity使用 配置文件 和wen.xml 文件配置

目录 1、web.xml 文件配置 2、spring-security 普通 为使用自己创建的认证类 1、web.xml 文件配置 !-- 配置SpringSecurity的拦截器 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring/spring-se…

Echo团队Alpha冲刺随笔 - 第九天

项目冲刺情况 进展 已经进入测试阶段&#xff0c;正在消除系统的bug问题 通过测试&#xff0c;找出了系统中存在的较多bug......体会 测试太重要了&#xff0c;很多原本以为没什么bug&#xff0c;一测就能找到好几个&#xff0c;而且改个bug真的可能新加n多个今日会议内容 黄少…

Windows下配置scrapy需要MVC的14.0版本(转载)

转载于--http://blog.csdn.net/MrWilliamVs/article/details/77130965 杨煜冬煜杨的博客&#xff0c;他的博客比较杂&#xff0c;Java、Python都有--http://blog.csdn.net/yyd19921214 环境依赖于 microsoft visual C 14.0, 仔细看报错后面还写着该C库的下载地址&#xff1b;(但…

关于SQLServer2005的学习笔记——约束、Check、触发器的执行顺序

通常我们认为一条 Insert 就是一个事务&#xff0c;但这个事务是如何执行的呢&#xff1f;如果保障事务执行时该事务的完整性和一致性呢&#xff1f;抛开存储机制、索引、锁等环节&#xff0c;让我们看看约束、 Check 和触发器在这个过程中的先后顺序&#xff0c;或许能加深些对…

Kubernetes集群部署(yum部署)

环境准备 Kubernetes-Master:192.168.37.134 #yum install kubernetes-master etcd flannel -y Kubernetes-node1:192.168.37.135 #yum install kubernetes-node etcd docker flannel *rhsm* -y Kubernetes-node2:192.168.37.146 #yum install kubernetes-node etcd…

完成个人中心—导航标签

个人中心—视图函数带标签页面参数tagapp.route(/usercenter/<user_id>/<tag>)def usercenter(user_id, tag): if tag ‘1: return render_template(usercenter1.html, **context)个人中心—导航标签链接增加tag参数<li role“presentation”><a…

PowerShell 2.0 实践(十二)管理 SQL Server 2008 R2(1)

DBA可以使用的工具很多&#xff0c;对于SQL Server来说&#xff0c;有查询分析器、事件探查器、命令行工具等&#xff0c;其中SQL语句是重中之重&#xff0c;但是PowerShell的出现使得DBA又多了一种选择。 测试脚本下载 本系列所有测试脚本均在Windows Server 2008 R2 DataCent…

Vue.js 学习路线

目录 1、Vue环境搭建 2、绑定数据 绑定对象 循环数组渲染数据 3、Vue 及双向数据绑定 Vue事件介绍 以及Vue中的ref获取dom节点 4、Vue事件 定义方法 执行方法 获取数据 改变数据 执行方法传值 以及事件对象 5、 Vue中创建单文件组件 注册组件 以及组件的使用 6、Vue中组…

企业信息化所面临的问题

企业信息化建设企业信息化所面临的问题 wxwinter 摘要 企业信息化所面临的问题以及对解决这问题的探讨目录 1 企业信息化建设走到今天所面临的问题 1 1.1 一、没有意识到信息化与工业化是一个不可分割的整体 1 1.2 二、系统零散,产生了信息孤岛 1 1.3 三…

windows 10 下部署WCF 一些细节

总体上在IIS中部署一个WCF服务和Win7没有什么区别 但是&#xff0c;如果你使用的是.NET 4.5开发的 WCF服务&#xff0c;而windows10 又安装了.net 4.7 那么你需要注意下面问题 转载于:https://www.cnblogs.com/songr/p/10806615.html

30岁前挣够500万

教你30岁前挣够500万&#xff01;&#xff08;不妨看完&#xff0c;心态会改变。&#xff09; 成功源于自信&#xff01;相信自己。下边每个字都是价值不菲&#xff0c;你认真看了吗&#xff1f;一艘没有航行目标的船&#xff0c;任何方向的风都是逆风1、你为什么是穷人&#x…

查看微码的两种方式hmcaix

转载于:https://www.cnblogs.com/jonathanyue/p/9301212.html

根据传入坐标和图片URL地址对图片进行切图操作、将图片转化成Base64位码

目录 1、根据传入坐标和图片URL地址对图片进行切图操作 2、将图片转化成Base64位编码、根据传入坐标 算出切点坐标 在开发过程的学习记录&#xff0c;此两个工具类主要是对图像的处理&#xff08;切图&#xff09;&#xff0c;对文件的想换转化&#xff0c;将文件转化成字节数…

SQL语句 goto

代码 /*********************求1234......................100的和*******************************/declaresumsmallint,ismallintseti1setsum0label: if(i<100) beginsetsumsumisetii1gotolabel endprintsum 都说不要用goto,可我看了一些经典sql 代码,…

zookeeper 和 dubbo 配置

转载于:https://www.cnblogs.com/tian1993/p/10807996.html