子在川上曰

            逝者如斯夫不舍晝夜
          隨筆 - 71, 文章 - 0, 評(píng)論 - 915, 引用 - 0
          數(shù)據(jù)加載中……

          jBPM開(kāi)發(fā)入門(mén)指南(4)

          7   jBPM 的客戶(hù)端開(kāi)發(fā)

          有了前面的 HelloWorld 后臺(tái)流程,我們就要開(kāi)始客戶(hù)端程序了。正如前面提到的,本文不寫(xiě) JSP ,而改采用 JUnit 的形式,輸出則用 System.out.println 。舉一反三,知道在方法中輸入及用 println 輸出,在 JSP SWING GUI 界面還不是一樣嘛。

          ?

          這個(gè) JUnit 客戶(hù)端,我們就借用創(chuàng)建項(xiàng)目時(shí)自動(dòng)生成的 SimpleProcessTest.java 了,改寫(xiě)后如下:

          package com.sample;

          ?

          import junit.framework.TestCase;

          ?

          import org.jbpm.JbpmConfiguration;

          import org.jbpm.JbpmContext;

          import org.jbpm.context.exe.ContextInstance;

          import org.jbpm.graph.def.ProcessDefinition;

          import org.jbpm.graph.exe.ProcessInstance;

          ?

          public class SimpleProcessTest extends TestCase {

          ?

          ??? private JbpmConfiguration config = JbpmConfiguration.getInstance();

          ??? private JbpmContext ctx = config.createJbpmContext();

          ??? // helloworld 對(duì)應(yīng)于 jbpm_processdefinition 表的 name 字段值,也即 processdefinition.xml name

          ??? // 這個(gè)值得取比較耗時(shí),實(shí)際項(xiàng)目里最好和“數(shù)據(jù)庫(kù)的 JDBC 連接”一樣,讓它共享,不要頻繁打開(kāi)關(guān)閉。

          ??? private ProcessDefinition processDefinition = ctx.getGraphSession().findLatestProcessDefinition("helloworld");

          ?

          ??? public void testNewRequest() {

          ??????? long id = newRequest();

          ??????? System.out.println("id=" + id);

          ??????? checkNewRequest(id);

          ??????? confirmRequest(id);

          ??????? checkconfirmRequest(id);

          ??????? ctx.close();// 關(guān)閉 jbpm 容器

          ??? }

          ?

          ??? /**

          ??? ? * 創(chuàng)建一個(gè)請(qǐng)假單

          ??? ? *

          ??? ? * @return

          ??? ? */

          ??? private long newRequest() {

          ??????? // 創(chuàng)建一個(gè)新流程

          ??????? ProcessInstance pi = processDefinition.createProcessInstance();

          ??????? // 取得流程的數(shù)據(jù)環(huán)境

          ??????? ContextInstance ci = pi.getContextInstance();

          ??????? // 創(chuàng)建一張請(qǐng)假單

          ??????? ci.setVariable("name", " 陳剛 www.chengang.com.cn" );

          ??????? ci.setVariable("day", 2);

          ??????? assertEquals(null, ci.getVariable("note"));

          ??????? // 請(qǐng)假申請(qǐng)結(jié)束,轉(zhuǎn)到下一個(gè)流程結(jié)點(diǎn)

          ??????? pi.signal();

          ??????? return pi.getId();

          ??? }

          ?

          ??? /**

          ??? ? * 檢查請(qǐng)假單的數(shù)據(jù)

          ??? ? *

          ??? ? * @param id

          ??? ? */

          ??? private void checkNewRequest(long id) {

          ??????? // 從數(shù)據(jù)庫(kù)提取原流程

          ??????? ProcessInstance pi = ctx.loadProcessInstance(id);

          ??????? // 取得流程的數(shù)據(jù)環(huán)境

          ??????? ContextInstance ci = pi.getContextInstance();

          ??????? // 創(chuàng)建一張請(qǐng)假單

          ??????? assertEquals(" 陳剛 www.chengang.com.cn" , ci.getVariable("name"));

          ??????? assertEquals(Integer.valueOf(2), ci.getVariable("day"));

          ??????? assertEquals(" 我要請(qǐng)假 " , ci.getVariable("note"));

          ?

          ??????? // 當(dāng)前是結(jié)點(diǎn)為 confirm

          ??????? assertEquals(pi.getRootToken().getNode().getName(), "confirm");

          ??????? // 流程還沒(méi)結(jié)束

          ??????? assertFalse(pi.hasEnded());

          ??? }

          ?

          ??? /**

          ??? ? * 審批陳剛的請(qǐng)假申請(qǐng)

          ??? ? *

          ??? ? * @param id

          ??? ? */

          ??? private void confirmRequest(long id) {

          ??????? ProcessInstance pi = ctx.loadProcessInstance(id);

          ??????? ContextInstance ci = pi.getContextInstance();

          ??????? // 不通過(guò)

          ??????? ci.setVariable("note", " 不準(zhǔn)請(qǐng)假,繼續(xù)加班 " );

          ??????? // 審批結(jié)束,到下一個(gè)流程結(jié)點(diǎn)

          ??????? pi.signal();

          ??? }

          ?

          ??? private void checkConfirmRequest(long id) {

          ??????? ProcessInstance pi = ctx.loadProcessInstance(id);

          ??????? ContextInstance ci = pi.getContextInstance();

          ??????? // ConfirmAction 類(lèi)在 signal 后執(zhí)行,所以覆蓋了經(jīng)理的審批意見(jiàn)

          ??????? assertEquals(" 準(zhǔn)假 " , ci.getVariable("note"));

          ?

          ??????? // 當(dāng)前是結(jié)點(diǎn)為 end

          ??????? assertEquals(pi.getRootToken().getNode().getName(), "end");

          ??????? // 流程結(jié)束了

          ??????? assertTrue(pi.hasEnded());

          ??? }

          ?

          }

          ?

          這個(gè)例子還是很簡(jiǎn)單,而且關(guān)鍵是缺少用戶(hù)、組、權(quán)限等工作流系統(tǒng)必須的東西,不過(guò)沒(méi)關(guān)系。下面的內(nèi)容我將完成一個(gè)更完整的實(shí)例。

          posted on 2006-08-24 18:15 陳剛 閱讀(30967) 評(píng)論(37)  編輯  收藏 所屬分類(lèi): jBPM

          評(píng)論

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          最近也再研究JBPM,謝謝樓主的文章,加油!
          2006-08-25 18:03 | 劉小偉

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          單元測(cè)試各個(gè)方法之間有依賴(lài)關(guān)系??
          2006-08-27 14:15 | pikachu

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          @pikachu
          為了簡(jiǎn)潔和閱讀代碼的方便,這里沒(méi)有遵照單元測(cè)試的原則。比如你所說(shuō)的方法之間的依賴(lài)性,還有對(duì)數(shù)據(jù)庫(kù)的依賴(lài),這都是單元測(cè)試的大忌。如果是要寫(xiě)真正的項(xiàng)目單元測(cè)試,jBPM的隨包文檔要更標(biāo)準(zhǔn)一些。
          2006-08-28 09:06 | 陳剛

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          如何將用戶(hù)、組、權(quán)限同流程點(diǎn)聯(lián)合起來(lái),請(qǐng)說(shuō)下你的思路好么?

          謝謝你的文章。繼續(xù)加油。
          2006-08-29 11:15 | ktm

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          @ktm
          后繼文章即將涉及
          2006-08-29 11:18 | 陳剛

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          附上中表的中文意思
          JBPM_ACTION action記錄表
          JBPM_DECISIONCONDITIONS 結(jié)果條件表
          JBPM_DELEGATION 委托表
          JBPM_EVENT 事件表 處理進(jìn)入或者離開(kāi)事件
          JBPM_EXCEPTIONHANDLER 異常處理表
          JBPM_ID_GROUP 用戶(hù)組表
          JBPM_ID_MEMBERSHIP 用戶(hù)成員表 表現(xiàn)用戶(hù)和組之間的多對(duì)多關(guān)系
          JBPM_ID_PERMISSIONS 用戶(hù)權(quán)限表
          JBPM_ID_USER 用戶(hù)表
          JBPM_MODULEDEFINITION 模塊定義表
          JBPM_MODULEINSTANCE 模塊實(shí)例表
          JBPM_NODE 流程節(jié)點(diǎn)表
          JBPM_POOLEDACTOR 匯集參與著表
          JBPM_PROCESSDEFINITION 流程定義表
          JBPM_PROCESSFILE 流程文件表
          JBPM_PROCESSFILEBLOCK 流程文件塊表
          JBPM_PROCESSINSTANCE 流程實(shí)例表
          JBPM_RUNTIMEACTION 運(yùn)行中行為表
          JBPM_SCRIPTVARIABLES 腳本變量表
          JBPM_SWIMLANE 泳道表
          JBPM_SWIMLANEINSTANCE 泳道實(shí)例表
          JBPM_TASK 任務(wù)表
          JBPM_TASKACTORPOOL 用戶(hù)行為匯總
          JBPM_TASKINSTANCE 任務(wù)實(shí)例
          JBPM_TIMER 計(jì)時(shí)表
          JBPM_TOKEN 令牌表
          JBPM_TOKENVARIABLEMAP 令牌變量影射表
          JBPM_TRANSITION 轉(zhuǎn)換表
          JBPM_VARIABLEINSTANCE 變量實(shí)例表
          JBPM_VARIABLEINSTANCEBLOCK 變量實(shí)例塊表
          JBPM_VARIABLEMAPPING 變量影射表
          2006-08-29 11:29 | ktm

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          期待繼續(xù)!
          2006-08-29 16:10 | maya

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          Jbpm31DataModel%2FJBoss+jBPM+Definition+Data+Model
          哈哈。好東西。這個(gè)圖片
          http://wiki.jboss.org/wiki/attach?page=Jbpm31DataModel%2FJBoss+jBPM+Definition+Data+Model.png
          2006-08-30 16:27 | ktm

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          樓主加油?。?
          期待你的新作
          2006-08-31 19:59 | nianlu

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          @ktm
          非常感謝您提供的表說(shuō)明
          2006-09-01 09:22 | 陳剛

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          最近也再研究JBPM,但是我有一個(gè)問(wèn)題想和樓主討論下,
          如何將一個(gè)業(yè)務(wù)系統(tǒng)和JBPM相結(jié)合,個(gè)人淺見(jiàn)認(rèn)為JBPM所提供的變量表的表結(jié)構(gòu)不適合進(jìn)行業(yè)務(wù)數(shù)據(jù)的各種組合查詢(xún).所以我現(xiàn)在的做法是只將流程所涉及的業(yè)務(wù)主鍵ID存入JBPM變量表,再在業(yè)務(wù)系統(tǒng)相關(guān)表中存入processInstanceID & taskInstanceID進(jìn)行流程定位,但是這樣做產(chǎn)生了在服務(wù)和JBPM間的一種看上去不是很好的一種關(guān)聯(lián),致使在我在服務(wù)上要做JBPM的管理 以及 在需要時(shí)還要先查出業(yè)務(wù)主鍵集合再到業(yè)務(wù)系統(tǒng)中查出主鍵對(duì)應(yīng)的實(shí)體信息.小弟學(xué)習(xí)不久可能做法有問(wèn)題,希望能從樓主那得到開(kāi)解!
          2006-09-02 18:48 | tom

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          陳大俠,您好!
          我是個(gè)JBPM的初學(xué)者,買(mǎi)過(guò)您ECLIPSE的書(shū),之前也把您關(guān)于JBPM的入門(mén)指南等全看了好幾遍,我想問(wèn)一下。。。如果我想要一個(gè)自己的JSP頁(yè)面,例如我要在頁(yè)面上放個(gè)下拉列表,放個(gè)表格,或者放個(gè)FLASH怎么辦。。。JBPM自帶的例子好象只有文本框。。。如果我放自己的東西他們應(yīng)該怎么和JBPM內(nèi)部對(duì)應(yīng)起來(lái)呢。。。
          望大俠指教一二。。。。呵呵。。。
          2006-09-04 15:17 | gaok

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          這是人家的學(xué)習(xí) ---Jboss JBPM 學(xué)習(xí)點(diǎn)滴
          (一)JBPM在Mysql 4.0以下運(yùn)行有問(wèn)題,主要是select語(yǔ)句的問(wèn)題。
          (二)JBPM 數(shù)據(jù)庫(kù)默認(rèn)的字符段是255個(gè)字符,有時(shí)需要修改,比如存儲(chǔ)文件的時(shí)候。JBPM數(shù)據(jù)庫(kù)默認(rèn)的字段類(lèi)型的定義有時(shí)候不一定適合需要,要手工進(jìn)行修改。
          (三)對(duì)于工作流定義文件-processdifinition.xml的中文問(wèn)題解決方案如下:
          (1)xml的Encoding設(shè)定成”GBK“
          (2)對(duì)于MySQL,hibernate相應(yīng)的driver設(shè)定成:jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=GBK
          (3)文字在顯示的時(shí)候要用toGBK轉(zhuǎn)換才能正確顯示。
          (4)對(duì)于Oracle來(lái)講,Hibernate使用的C3P0連接池有問(wèn)題,可用最新的C3P0代替。如果XML定義文件采用UTF8定義,顯示時(shí)可不用做GBK轉(zhuǎn)換。

          發(fā)來(lái)看看??赡軐?duì)gaok有幫助
          2006-09-05 09:04 | ktm

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          @gaok
          JSP-->Servlet-->jBPM,Servlet里的寫(xiě)法就參考本指南的寫(xiě)法。
          2006-09-05 09:35 | 陳剛

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          15:55:56,109 [main] INFO SessionFactoryImpl : Checking 28 named queries
          15:55:56,640 [main] ERROR ErrorCounter : *** ERROR: line 4:47: unexpected token: t
          15:55:56,703 [main] ERROR ErrorCounter : *** ERROR: line 3:43: expecting "set", found 't'
          15:55:56,718 [main] ERROR ErrorCounter : *** ERROR: line 3:43: expecting "set", found 't'
          15:55:56,781 [main] ERROR ErrorCounter : *** ERROR: line 3:48: unexpected token: t
          15:55:56,812 [main] ERROR ErrorCounter : *** ERROR: line 4:33: unexpected token: m
          15:55:56,812 [main] ERROR SessionFactoryImpl : Error in named query: SchedulerSession.deleteTimersForProcessInstance
          org.hibernate.hql.ast.QuerySyntaxError: unexpected token: t near line 3, column 48 [

          delete from org.jbpm.scheduler.exe.Timer t
          where t.processInstance = :processInstance

          為什么部署的時(shí)候出現(xiàn)這個(gè)錯(cuò)誤?
          2006-09-07 16:01 | chuanyuan

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          陳大哥。啥時(shí)候上第五章啊。。。

          乎乎·~
          2006-09-09 16:30 | ktm

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          例子中
          checkconfirmRequest(id); 應(yīng)改為checkConfirmRequest(id);
          assertEquals(" 我要請(qǐng)假 " , ci.getVariable("note"));
          就改為:assertEquals("我要請(qǐng)假" , ci.getVariable("note"));
          2006-09-09 17:10 | zqh

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          期待你后續(xù)的文章
          2006-09-13 17:08 | 學(xué)習(xí)者

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          你好,
          我正在研究JBPM,看了您的文章很有啟發(fā),
          不過(guò)我對(duì)于用戶(hù),權(quán)限,以及怎樣和自己設(shè)計(jì)的JSP頁(yè)面統(tǒng)一還是不明白?能否就這方面多一點(diǎn)內(nèi)容,十分感謝!
          2006-09-22 10:18 | ppxiaofei

          # 希望你能出書(shū)  回復(fù)  更多評(píng)論   

          希望陳大哥能出書(shū)??淳W(wǎng)上的文章不是丟這,就是缺那。
          2006-11-21 10:16 | java愛(ài)好者[匿名]

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          你好! 我看了您的文章受益匪淺。
          我請(qǐng)教個(gè)問(wèn)題,文章中設(shè)置流程實(shí)例變量(不知道這樣叫對(duì)不對(duì))用的是方法
          ContextInstance ci = pi.getContextInstance();

          // 不通過(guò)

          ci.setVariable("note", " 不準(zhǔn)請(qǐng)假,繼續(xù)加班 " );

          但是我看 jbpm的例子中使用的是如下方法:
          taskInstance.setVariable(taskFormParameter.getLabel(), taskFormParameter.getValue());
          這個(gè)應(yīng)該和流程中的變量域有關(guān)吧? 是不是這個(gè)變量設(shè)置到 taskinstance這個(gè)范圍小一點(diǎn)的變量域中比較合適,contextinstance是不是全局都可見(jiàn)不是很好? 還是有參考的標(biāo)準(zhǔn)?
          2006-12-03 20:46 | lyo

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          @ktm
          那個(gè)ER圖什么工具設(shè)計(jì)的 ??
          2006-12-11 12:37 | 黃鵬霄[匿名]

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          期待下一章,大哥快上吧
          2006-12-21 11:03 | wala

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          我在使用你的客戶(hù)端的時(shí)候會(huì)出現(xiàn)異常
          pi = processDefinition.createProcessInstance();
          pi 為null
          這是那里的問(wèn)題?
          2007-01-03 20:12 | horsezp

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          @chuanyuan
          http://www.jboss.org/?module=bb&op=viewtopic&p=3941594

          把jboss中的hibernate.jar & hibernate-matedata.jar 去掉,換上hibnernate3.1.jar以上的版本就行了
          我換上了3.2,行了。
          2007-01-18 17:23 | tony810428@hotmail.com

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          后臺(tái)測(cè)試是正常的,客戶(hù)端測(cè)試的時(shí)候出下面的錯(cuò)誤
          junit.framework.AssertionFailedError: expected:<我要請(qǐng)假> but was:<null>
          2007-04-23 20:27 | yollywu

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          checkNewRequest(id);
          assertEquals(" 我要請(qǐng)假 " , ci.getVariable("note"));提示錯(cuò)誤出在這兩處
          2007-04-23 21:53 | yollywu

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          package simple;
          import java.io.FileInputStream;
          import java.io.FileNotFoundException;
          import java.io.InputStream;

          import junit.framework.TestCase;

          import org.jbpm.JbpmConfiguration;
          import org.jbpm.JbpmContext;
          import org.jbpm.graph.def.ProcessDefinition;
          public class DeployProcessTest extends TestCase {
          /**
          * 在本方法執(zhí)行完畢后,檢查 jbpm_processdefinition 表會(huì)多了一條記錄
          *
          * @throws FileNotFoundException
          */
          public void testDeployProcessDefinition() throws FileNotFoundException {
          // 從 jbpm.cfg.xml 取得 jbpm 的配置
          JbpmConfiguration config = JbpmConfiguration.getInstance();
          // 創(chuàng)建一個(gè) jbpm 容器
          JbpmContext jbpmContext = config.createJbpmContext();
          // 由 processdefinition.xml 生成相對(duì)應(yīng)的流程定義類(lèi) ProcessDefinition
          InputStream is = new FileInputStream("E:/eclipse/workspace/myjbpm/bin/simple/processdefinition.xml");
          ProcessDefinition processDefinition = ProcessDefinition.parseXmlInputStream(is);
          // 利用容器的方法將流程定義數(shù)據(jù)部署到數(shù)據(jù)庫(kù)上
          jbpmContext.deployProcessDefinition(processDefinition);
          // 關(guān)閉 jbpmContext
          jbpmContext.close();
          }

          public static void main(String arg[]){
          DeployProcessTest t = new DeployProcessTest();
          try{
          t.testDeployProcessDefinition();
          }catch(Exception e){
          e.printStackTrace();
          }


          }
          }


          程序執(zhí)行到 ProcessDefinition processDefinition = ProcessDefinition.parseXmlInputStream(is);
          出現(xiàn)以下錯(cuò)誤:

          15:58:30,625 [main] ERROR JpdlXmlReader : couldn't parse process definition
          org.dom4j.DocumentException: Error on line 2 of document : The processing instruction target matching "[xX][mM][lL]" is not allowed. Nested exception: The processing instruction target matching "[xX][mM][lL]" is not allowed.
          at org.dom4j.io.SAXReader.read(SAXReader.java:482)
          at org.jbpm.jpdl.xml.JpdlParser.parse(JpdlParser.java:57)
          at org.jbpm.jpdl.xml.JpdlXmlReader.readProcessDefinition(JpdlXmlReader.java:138)
          at org.jbpm.graph.def.ProcessDefinition.parseXmlInputStream(ProcessDefinition.java:172)
          at simple.DeployProcessTest.testDeployProcessDefinition(DeployProcessTest.java:24)
          at simple.DeployProcessTest.main(DeployProcessTest.java:34)
          Nested exception:
          org.xml.sax.SAXParseException: The processing instruction target matching "[xX][mM][lL]" is not allowed.
          at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1269)
          at org.dom4j.io.SAXReader.read(SAXReader.java:465)
          at org.jbpm.jpdl.xml.JpdlParser.parse(JpdlParser.java:57)
          at org.jbpm.jpdl.xml.JpdlXmlReader.readProcessDefinition(JpdlXmlReader.java:138)
          at org.jbpm.graph.def.ProcessDefinition.parseXmlInputStream(ProcessDefinition.java:172)
          at simple.DeployProcessTest.testDeployProcessDefinition(DeployProcessTest.java:24)
          at simple.DeployProcessTest.main(DeployProcessTest.java:34)
          org.jbpm.jpdl.JpdlException: [[FATAL] line 2: The processing instruction target matching "[xX][mM][lL]" is not allowed., [ERROR] couldn't parse process definition]
          at org.jbpm.jpdl.xml.JpdlXmlReader.readProcessDefinition(JpdlXmlReader.java:163)
          at org.jbpm.graph.def.ProcessDefinition.parseXmlInputStream(ProcessDefinition.java:172)
          at simple.DeployProcessTest.testDeployProcessDefinition(DeployProcessTest.java:24)
          at simple.DeployProcessTest.main(DeployProcessTest.java:34)
          請(qǐng)問(wèn)是什么問(wèn)題阿
          2007-07-09 16:17 | 小云

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          java.lang.NullPointException
          還有第41和71行有錯(cuò)誤,
          為什么啊,有哪位大俠能夠告訴我??!
          2007-08-17 18:35 | lxp

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          @horsezp
          我也是同樣的問(wèn)題,你怎么解決的啊!
          2007-08-17 18:39 | lxp

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          ProcessInstance pi = processDefinition.createProcessInstance();
          ……
          long id = newRequest();

          NullPointerException異常??!
          換了hibernate3.1也不行
          2007-09-05 14:38 | liumingrui

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          強(qiáng)烈推薦去看看jboss seam里DvdStore的例子,是系統(tǒng)集成jbpm
          2008-06-05 10:37 | rock_soft

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4) [未登錄](méi)  回復(fù)  更多評(píng)論   

          我現(xiàn)在迷糊了,要運(yùn)行出什么樣的結(jié)果才是正確了呢?在JUnit面板中顯示Failures:1。那就是說(shuō)失敗了吧,最后結(jié)果打印出了id=1. 如果運(yùn)行成功了,效果是什么樣子的呢?
          2008-09-23 15:11 | 小鳥(niǎo)

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4) [未登錄](méi)  回復(fù)  更多評(píng)論   

          呵呵,我知道為什么了。在這個(gè)地方assertEquals(" 我要請(qǐng)假 " , ci.getVariable("note"));,我要請(qǐng)假前后有空格,跟ci.getVariable("note"取的值不相等,所以就錯(cuò)了。
          2008-09-23 15:25 | 小鳥(niǎo)

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          public void testNewRequest() { 方法出錯(cuò) 請(qǐng)問(wèn)怎么解決啊 急!?。。。。。。。。。。。。?!
          2009-07-24 17:34 |

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          public void testNewRequest() { 方法出錯(cuò) 請(qǐng)問(wèn)怎么解決啊 急?。。。。。。。。。。。。。?!
          2009-07-24 17:34 |

          # re: jBPM開(kāi)發(fā)入門(mén)指南(4)   回復(fù)  更多評(píng)論   

          見(jiàn)教了,好容易入門(mén),呵呵,希望還有更好的工作流例子,共享下
          2009-09-12 11:40 | zw7534313
          主站蜘蛛池模板: 康乐县| 云梦县| 建平县| 勐海县| 商丘市| 吴川市| 汤原县| 新田县| 合川市| 西吉县| 宝山区| 荥阳市| 大方县| 榆树市| 高碑店市| 萝北县| 玉林市| 鲜城| 无棣县| 上栗县| 利津县| 武城县| 郸城县| 通州市| 塘沽区| 娱乐| 思南县| 卫辉市| 盐城市| 工布江达县| 四会市| 平谷区| 府谷县| 永州市| 阜康市| 抚顺县| 清丰县| 鹤庆县| 南投市| 稷山县| 阜南县|