JBPM4常见错误汇总
1.在tomcat6.0下布署錯誤
?? 基于JBPM4的web項目jsp頁面發布出錯
現象:
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:
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設置為:
??
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK" />
?
? * 注意修改后重新啟動tomcat才能起作用。
4.運行出錯時,數據庫中的所有數據丟失
現象:
?? 運行出錯后,數據庫中的所有數據丟失,包括流程定義文件
原因:
?? jbpm.hibernate.cfg.xml文件中有一個配置
幾個參數的意思,我解釋一下:
validate 加載hibernate時,驗證創建數據庫表結構
create 每次加載hibernate,重新創建數據庫表結構,這就是導致數據庫表數據丟失的原因。
create-drop 加載hibernate時創建,退出是刪除表結構
update 加載hibernate自動更新數據庫結構
none 不進行任何操作
?
?? 由于jbpm4的默認配置為create-drop,所以出現以上問題
解決方法:
?? 將jbpm.hibernate.cfg.xml文件中修改如下
?
5.在eclipse3.5流程設計器上設計流程時,中文出現亂碼
現象:
?? 將流程設計好之后,點擊保存,再查看代碼,發現中文是亂碼
原因:
?? 不清楚,應該是插件的bug
解決方法:
?? 將流程設計好之后,不要點保存,先將界面切換到代碼窗口,這時可以看到中文,再點擊保存
6.無法布署zip流程定義文件
現象:
?? 提示以下錯誤
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>下,添加
?
?? 即可
7.無法布署zip流程定義文件
現象:
?? 提示錯誤
org.hibernate.exception.GenericJDBCException: could not insert: [org.jbpm.pvm.internal.lob.Lob]
?
原因:
?? 布署ZIP流程定義文件時hiberate無法插入blob
?? 用網絡上提議的方法,添加以下配置
<property name="hibernate.jdbc.use_streams_for_binary">true</property>
?
?? 也不行
解決方法:
?? 采用以上方法,還是無法通過,最后重啟操作系統,就解決了,奶奶的。
8.布署zip流程定義文件成功,但是數據庫中中文為亂碼
現象:
<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類中的方法進行修改
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
總結
以上是生活随笔為你收集整理的JBPM4常见错误汇总的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “木应正始音”下一句是什么
- 下一篇: Asp.net(C#)给图片加上水印效果