我写了一个客户评审流程,在发启流程时出现空指针异常,这是我写的发启流程的代码:
try{
          //根据流程名称得到流程模板
            ProcessDefinition pd = context.getGraphSession()
                    .findLatestProcessDefinition(processDefName);
            //创建流程实例
            ProcessInstance pi = pd.createProcessInstance();
            //?
            pi.getContextInstance().setVariable("applyer", actorId);
            //创建开始任务模板
            TaskMgmtInstance tmi = pi.getTaskMgmtInstance();
            TaskInstance ti = tmi.createStartTaskInstance();            
            if(ti != null) {
                if (param != null) {
                    Iterator<String> it = param.keySet().iterator();
                    while(it.hasNext()) {
                        String key = it.next();
                        String value =(String)param.get(key);
                        ti.setVariable(key, value);
                    }
                }
                
                //节点开始
                ti.start();
                //记录流程启动人
                ti.setActorId(actorId);
                //节点结束,流程往下走
                ti.end();
                //保存任务
                context.save(ti);
            }
        }catch(Exception e){
            e.printStackTrace();
在执行TaskInstance ti = tmi.createStartTaskInstance();句时抛出异常:
java.lang.NullPointerException
at org.jbpm.taskmgmt.def.TaskController.initializeVariables(TaskController.java:77)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:197)
at org.jbpm.taskmgmt.def.TaskController_$$_javassist_71.initializeVariables(TaskController_$$_javassist_71.java)
at org.jbpm.taskmgmt.exe.TaskInstance.initializeVariables(TaskInstance.java:148)
at org.jbpm.taskmgmt.exe.TaskMgmtInstance.createTaskInstance(TaskMgmtInstance.java:130)
at org.jbpm.taskmgmt.exe.TaskMgmtInstance.createStartTaskInstance(TaskMgmtInstance.java:278)
at com.lttc.business.jbpm.service.JbpmProcessImpl.startProcess(JbpmProcessImpl.java:555)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:310)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy22.startProcess(Unknown Source)
at com.lttc.business.jbpm.action.KeHuPingShengAction.startProcess(KeHuPingShengAction.java:245)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:440)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:279)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:163)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:249)
at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:148)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:93)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:128)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
at org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:104)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:148)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:128)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:468)
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:619)断点跟踪发现tmi不是空,不知道是什么原因,高手指点一下

解决方案 »

  1.   

    是在initializeVariables初始化变量的时候抛得空,可能是tmi里面有空的变量,导致创建的时候出现空指针吧
      

  2.   

    可能是  pi.getContextInstance().setVariable("applyer", actorId);
    不能只看tmi是否有值,其他的例如pi..actorId等,如果出现空值的话
    那一样也能导致空指针异常
      

  3.   

    这是我的流程<?xml version="1.0" encoding="UTF-8"?>
    <process-definition xmlns=""  name="客户评审流程"> <start-state name="启动流程">
    <task name="启动流程" form="/zyerp/jbpm/process/keHuPingSheng!loadStartPage">
    <assignment actor-id="123"></assignment>
    <controller class=""></controller>
    </task>
    <transition to="组长审批" name="组评审批"></transition>
    </start-state>
    <task-node name="副经理审批">
    <task name="副经理审批" form="/zyerp/jbpm/process/keHuPingSheng!loadFuJingLiShenPiPage">
    <assignment class="com.lttc.business.jbpm.assign.KeHuPingShenFuZongJingLi"></assignment>
    </task>
    <transition to="经理审批" name="通过"></transition>
    <transition to="结束" name="驳回"></transition>
    </task-node> <task-node name="组长审批">
    <task name="组长审批" form="/zyerp/jbpm/process/keHuPingSheng!loadZuZhangShenPiPage">
    <assignment class="com.lttc.business.jbpm.assign.KeHuPingShenZuZhang"></assignment>
    </task>
    <transition to="副经理审批" name="通过"></transition>
    <transition to="结束" name="驳回"></transition>
    </task-node> <task-node name="经理审批">
    <task name="经理审批" form="/zyerp/jbpm/process/keHuPingSheng!loadJingLiShenPiPage">
    <assignment class="com.lttc.business.jbpm.assign.KeHuPingShenJingLi"></assignment>
    </task>
    <transition to="客户登记" name="通过"></transition>
    <transition to="结束" name="驳回"></transition>
    </task-node> <node name="客户登记">
    <action name="客户登记" class="com.lttc.business.jbpm.actionHandler.KuHuiDengJiAction"></action>
    <transition to="结束" name="结束"></transition>
    </node>
    <end-state name="结束"></end-state>
    </process-definition>
      

  4.   


    不是空,可能是我流程设计的事,因为刚才我用一个请假流程测试了一下,流程正常发启,是不是我写的这个流程有问题,4楼是客户评审流程的xml
      

  5.   

    解决了,是因为我流程设计的问题在<start-state name="启动流程">
            <task name="启动流程" form="/zyerp/jbpm/process/keHuPingSheng!loadStartPage">
                <assignment actor-id="123"></assignment>
                <controller class=""></controller>
            </task>
            <transition to="组长审批" name="组评审批"></transition>
        </start-state>
    中多了一句<controller class=""></controller>去掉这名流程正常启动
    可是这句是什么意思