在做报销工作流实例时,用到子流程,在TaskInstance的end时出现如下错误提示:
org.jbpm.JbpmException: can't create a process instance when processDefinition is null
at org.jbpm.graph.exe.ProcessInstance.<init>(ProcessInstance.java:87)
......报销流程定义(只列出部分内容)
<task-node name="部门主管审核">
      <task name="主管审核">
      <controller>
            <variable name="baixiaoId" access="read" mapped-name="报销ID"></variable>
         </controller>
         <assignment class="org.springmodules.workflow.jbpm31.JbpmHandlerProxy" config-type="bean">
            <targetBean>managerAssignment</targetBean>
            <factoryKey>jbpmConfiguration</factoryKey>
         </assignment>
      </task>
      <transition name="要求修改" to="申请人修改报销单"></transition>
      <transition name="主管同意" to="判断走向"></transition>
   </task-node>
<decision name="判断走向">
      <handler class="org.springmodules.workflow.jbpm31.JbpmHandlerProxy">
        <targetBean>processDecision</targetBean>
        <factoryKey>jbpmConfiguration</factoryKey>
      </handler>
      <transition name="大于10000" to="老板审核申请"></transition>
      <transition name="小于10000" to="财务处理流程"></transition>
      <transition name="主管不同意" to="自动处理申请结果"></transition>
   </decision><process-state name="财务处理流程">
      <sub-process name="caiwu"/>
      <variable name="baixiaoId" access="read" mapped-name="报销ID"></variable>
      <transition name="" to="自动处理申请结果"></transition>
</process-state>财务处理流程
<?xml version="1.0" encoding="UTF-8"?><process-definition 
  xmlns="urn:jbpm.org:jpdl-3.1"
  name="caiwu">
   <start-state name="start">
      <transition name="to_caiwu" to="自动财务处理"></transition>
   </start-state>
   <end-state name="end1"></end-state>
   <node name="自动财务处理">      
      <event type="node-enter">
         <action name="cai" class="org.springmodules.workflow.jbpm31.JbpmHandlerProxy">
            <factoryKey>jbpmConfiguration</factoryKey>
            <targetBean>caiwuprocessAction</targetBean>
         </action>
      </event>
      <transition name="to_end" to="end1"></transition>
   
   </node>
</process-definition>部门主管审核,做审核通过,部分代码如下:保存审核通过信息.....
JbpmContext jbpmContext=jbpmConfiguration.getCurrentJbpmContext();
if(jbpmContext==null)
{
  jbpmContext=jbpmConfiguration.createJbpmContext();
}
try {
  TaskInstance ti=jbpmContext.getTaskMgmtSession().getTaskInstance(Long.parseLong(tid));
  if(result=="主管同意"||result=="主管不同意")
  {
ti.end("主管同意");
  }
  else{
ti.end("要求修改");
  }
执行到ti.end("主管同意")提示
org.jbpm.JbpmException: can't create a process instance when processDefinition is null
at org.jbpm.graph.exe.ProcessInstance.<init>(ProcessInstance.java:87)
......后来查找网上出现的类似问题的解决方法,其中有个方法说是<sub-process 加入属性binding="late",但是提示:cvs-complex-type.3.2.2 Attribute 'binding' is not allowed to appear in element 'sub-process',请使用过Jbpm工作流的高手给予解答,我所使用的jbpm为jbpm-3.1.4.jar,spring-modules-jbpm31.jar

解决方案 »

  1.   

    光看你这样描述很难找到问题症状所在。
    can't create a process instance when processDefinition is null 这个信息说明流程定义还没初始化的时候,你就开始创建实例。
      

  2.   

    先把子流程模板部署到DB中,最后在JbpmContext.deployProcessDefinition(父流程模板);就不会出现这样的问题了!
      

  3.   

    流程发布的问题.
    我刚刚才解决.
    ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(content);//查找子流程
    for(JbpmNode jbpmNode : graph.getSubProcesses()){
    String subProcessName = jbpmNode.getSubProcessName();
    ProcessDefinition subDefinition=jbpmContext.getGraphSession().findLatestProcessDefinition(subProcessName);
    if(subDefinition==null){
    throw new Exception("请先发布子流程'"+subProcessName+"'");
    }

    //建立关联关系
    ProcessState processState = (ProcessState) processDefinition.getNode(jbpmNode.getName());
        processState.setSubProcessDefinition(subDefinition);
    }// Deploy the process definition in the database
    jbpmContext.deployProcessDefinition(processDefinition);这是我的实际代码.关键在于
    //建立关联关系
    ProcessState processState = (ProcessState) processDefinition.getNode(jbpmNode.getName());
    processState.setSubProcessDefinition(subDefinition);
      

  4.   

    接触过jbpm  和oa系统但没接触 有 子流程的
      

  5.   

    先把子流程模板部署到DB中,最后在JbpmContext.deployProcessDefinition(父流程模板);就不会出现这样的问题了!