2009年三月27日10:18:08,125] [ERROR] [org.apache.catalina.core.StandardWrapperValve.invoke      (269)]: Servlet.service() for servlet action threw exception
java.lang.NullPointerException
at org.jbpm.graph.exe.Token.startCompositeLog(Token.java:365)
at org.jbpm.graph.exe.Token.signal(Token.java:187)
at org.jbpm.graph.exe.Token.signal(Token.java:157)
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.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:157)
at org.jbpm.graph.exe.Token$$EnhancerByCGLIB$$783f388.signal(<generated>)
at org.jbpm.graph.exe.ProcessInstance.signal(ProcessInstance.java:263)
at com.tkams.um.jbpm.JbpmFacadeImpl.nextStep(JbpmFacadeImpl.java:106)
at com.tkams.um.doc.manager.impl.DocumentManagerImpl.submitToWorkflow(DocumentManagerImpl.java:141)
at com.tkams.um.doc.manager.impl.DocumentManagerImpl.addDocument(DocumentManagerImpl.java:68)
at com.tkams.am.manage.struts.action.SubmitScrapAction.execute(SubmitScrapAction.java:80)
at org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:110)
at org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)
at org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67)
at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at com.tkams.common.filter.ForceLoginFilter.doFilter(ForceLoginFilter.java:74)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:95)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:825)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:731)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:526)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:619)执行processInstance。signal()方法报错
高手给看看 搞了两天了 就是搞不定 晕死了

解决方案 »

  1.   

    java.lang.NullPointerException 空指针异常,找找什么对象为null,debug下
      

  2.   

    Token.java:365
    请贴出关键代码,这样好分析!
      

  3.   

    这是我的代码public void addDocument(TkDocument document, String workflowName, String userId) {

    //保存公文信息
    document.setCreatorId(userId);
    document.setStatus(TkDocument.STATUS_NEW);
    document.setCreatetime(new Date());

    //设置其它属性
    //document.setPropertiesMap(props);

    getHibernateTemplate().save(document);

    //添加流程实例
    long processInstanceId = jbpmFacade.addProcessInstance(workflowName, document);

    //绑定流程实例的标识到公文对象
    document.setProcessinstanceid(processInstanceId);
    getHibernateTemplate().update(document);
    //得到下一步的transitionName
    String transitionName = null;
    List transetionNames = jbpmFacade.searchNextTransitions(processInstanceId, userId);
    for (Iterator iterator = transetionNames.iterator(); iterator.hasNext();) {
    String name = (String) iterator.next();
    transitionName = name;
    }
     String documentId = document.getId();
     System.out.println(documentId);
    //提交到流程
    submitToWorkflow(userId, documentId, transitionName);
    }
    public void submitToWorkflow(String userId, String documentId, String transitionName) {
    TkUser user = (TkUser)getHibernateTemplate().load(TkUser.class, userId);
    String username = user.getUserName();

    TkDocument document = (TkDocument)getHibernateTemplate().load(TkDocument.class, documentId);
    long processInstanceId = document.getProcessinstanceid();

    String status = jbpmFacade.nextStep(processInstanceId,username, transitionName);

    document.setStatus(status);
    getHibernateTemplate().update(document);
    }
    public long addProcessInstance(String processName,TkDocument document) {

    JbpmContext context = getJbpmContext();

    ProcessDefinition def = context.getGraphSession().findLatestProcessDefinition(processName);

    ProcessInstance instance = new ProcessInstance(def);

    instance.getContextInstance().setVariable("document", document.getId());
    context.save(instance);

    return instance.getId();
    }
    public List searchNextTransitions(long processInstanceId, String actorId) {
    JbpmContext context = getJbpmContext();
    ProcessInstance instance = context.getProcessInstance(processInstanceId);

    //当前节点
    String currentNodeName = instance.getRootToken().getNode().getName();

    //起点的名称
    String startNodeName = instance.getProcessDefinition().getStartState().getName();

    Collection transitions = null;

    //如果是在起点
    if(startNodeName.equals(currentNodeName)){
    transitions = instance.getRootToken().getAvailableTransitions();
    }else{
    List taskInstances = context.getTaskMgmtSession().findTaskInstances(actorId);
    for (Iterator iterator = taskInstances.iterator(); iterator
    .hasNext();) {
    TaskInstance ti = (TaskInstance) iterator.next();
    if(ti.getToken().getProcessInstance().getId() == processInstanceId){
    transitions = ti.getAvailableTransitions();
    break;
    }
    }

    //查找所属组的任务实例
    List pooledTaskInstances = context.getTaskMgmtSession().findPooledTaskInstances(actorId);
    for (Iterator iterator = pooledTaskInstances.iterator(); iterator
    .hasNext();) {
    TaskInstance ti = (TaskInstance) iterator.next();
    if(ti.getToken().getProcessInstance().getId() == processInstanceId){
    transitions = ti.getAvailableTransitions();
    }
    }
    }

    List transitionNames = new ArrayList();

    if(transitions != null){

    for (Iterator iterator = transitions.iterator(); iterator.hasNext();) {
    Transition transition = (Transition) iterator.next();
    transitionNames.add(transition.getName());
    }
    }

    return transitionNames;
    }
    public String nextStep(long processInstanceId, String actorId,
    String transitionName) {

    JbpmContext context = getJbpmContext();
    ProcessInstance instance = context.getProcessInstance(processInstanceId);
    //当前节点
    String currentNodeName = instance.getRootToken().getNode().getName();

    //起点的名称
    String startNodeName = instance.getProcessDefinition().getStartState().getName();
    System.out.println(instance.getRootToken());
    //如果是在起点
    if(startNodeName.equals(currentNodeName)){
    if(transitionName == null){
    [color=#FF0000]instance.signal();
    }else{
    instance.signal(transitionName);
    报空指针
    }
    }else{[/color] List taskInstances = context.getTaskMgmtSession().findTaskInstances(actorId);
    for (Iterator iterator = taskInstances.iterator(); iterator
    .hasNext();) {
    TaskInstance ti = (TaskInstance) iterator.next();
    if(ti.getToken().getProcessInstance().getId() == processInstanceId){
    if(transitionName == null){
    ti.end();
    }else{
    ti.end(transitionName);
    }
    break;
    }
    }


    //查找所属组的任务实例
    List pooledTaskInstances = context.getTaskMgmtSession().findPooledTaskInstances(actorId);
    for (Iterator iterator = pooledTaskInstances.iterator(); iterator
    .hasNext();) {
    TaskInstance ti = (TaskInstance) iterator.next();
    if(ti.getToken().getProcessInstance().getId() == processInstanceId){
    if(transitionName == null){
    ti.end();
    }else{
    ti.end(transitionName);
    }
    break;
    }
    }
    }
      

  4.   

    这是我的代码::
    //添加公文
    public void addDocument(TkDocument document, String workflowName, String userId) {

    //保存公文信息
    document.setCreatorId(userId);
    document.setStatus(TkDocument.STATUS_NEW);
    document.setCreatetime(new Date());

    //设置其它属性
    //document.setPropertiesMap(props);

    getHibernateTemplate().save(document);

    //添加流程实例
    long processInstanceId = jbpmFacade.addProcessInstance(workflowName, document);

    //绑定流程实例的标识到公文对象
    document.setProcessinstanceid(processInstanceId);
    getHibernateTemplate().update(document);
    //得到下一步的transitionName
    String transitionName = null;
    List transetionNames = jbpmFacade.searchNextTransitions(processInstanceId, userId);
    for (Iterator iterator = transetionNames.iterator(); iterator.hasNext();) {
    String name = (String) iterator.next();
    transitionName = name;
    }
     String documentId = document.getId();
     System.out.println(documentId);
    //提交到流程
    submitToWorkflow(userId, documentId, transitionName);
    }
    public long addProcessInstance(String processName,TkDocument document) {

    JbpmContext context = getJbpmContext();

    ProcessDefinition def = context.getGraphSession().findLatestProcessDefinition(processName);

    ProcessInstance instance = new ProcessInstance(def);

    instance.getContextInstance().setVariable("document", document.getId()); context.save(instance);

    return instance.getId();
    }
    public List searchNextTransitions(long processInstanceId, String actorId) {
    JbpmContext context = getJbpmContext();
    ProcessInstance instance = context.getProcessInstance(processInstanceId);

    //当前节点
    String currentNodeName = instance.getRootToken().getNode().getName();

    //起点的名称
    String startNodeName = instance.getProcessDefinition().getStartState().getName();

    Collection transitions = null;

    //如果是在起点
    if(startNodeName.equals(currentNodeName)){
    transitions = instance.getRootToken().getAvailableTransitions();
    }else{
    List taskInstances = context.getTaskMgmtSession().findTaskInstances(actorId);
    for (Iterator iterator = taskInstances.iterator(); iterator
    .hasNext();) {
    TaskInstance ti = (TaskInstance) iterator.next();
    if(ti.getToken().getProcessInstance().getId() == processInstanceId){
    transitions = ti.getAvailableTransitions();
    break;
    }
    }

    //查找所属组的任务实例
    List pooledTaskInstances = context.getTaskMgmtSession().findPooledTaskInstances(actorId);
    for (Iterator iterator = pooledTaskInstances.iterator(); iterator
    .hasNext();) {
    TaskInstance ti = (TaskInstance) iterator.next();
    if(ti.getToken().getProcessInstance().getId() == processInstanceId){
    transitions = ti.getAvailableTransitions();
    }
    }
    }

    List transitionNames = new ArrayList();

    if(transitions != null){

    for (Iterator iterator = transitions.iterator(); iterator.hasNext();) {
    Transition transition = (Transition) iterator.next();
    transitionNames.add(transition.getName());
    }
    }

    return transitionNames;
    }

    public String nextStep(long processInstanceId, String actorId,
    String transitionName) {

    JbpmContext context = getJbpmContext();
    ProcessInstance instance = context.getProcessInstance(processInstanceId);
    //当前节点
    String currentNodeName = instance.getRootToken().getNode().getName();

    //起点的名称
    String startNodeName = instance.getProcessDefinition().getStartState().getName();
    System.out.println(instance.getRootToken());
    //如果是在起点
    if(startNodeName.equals(currentNodeName)){
    if(transitionName == null){
    instance.signal();
    }else{
    instance.signal(transitionName);
    }
    这里抛空指针 }else{
    List taskInstances = context.getTaskMgmtSession().findTaskInstances(actorId);
    for (Iterator iterator = taskInstances.iterator(); iterator
    .hasNext();) {
    TaskInstance ti = (TaskInstance) iterator.next();
    if(ti.getToken().getProcessInstance().getId() == processInstanceId){
    if(transitionName == null){
    ti.end();
    }else{
    ti.end(transitionName);
    }
    break;
    }
    }


    //查找所属组的任务实例
    List pooledTaskInstances = context.getTaskMgmtSession().findPooledTaskInstances(actorId);
    for (Iterator iterator = pooledTaskInstances.iterator(); iterator
    .hasNext();) {
    TaskInstance ti = (TaskInstance) iterator.next();
    if(ti.getToken().getProcessInstance().getId() == processInstanceId){
    if(transitionName == null){
    ti.end();
    }else{
    ti.end(transitionName);
    }
    break;
    }
    }
    }

    //返回转向之后的节点名称
    return instance.getRootToken().getNode().getName();
    }
      

  5.   

    有2种可能为NULL
    1、确定 transitionName 是否为NULL
    2、ProcessInstance instance = context.getProcessInstance(processInstanceId)为NULL,
    3、确定processInstanceId是否为空,或是否存在这样一步一步的跟踪吧!坚持就是胜利啊!
      

  6.   

      事务的原因,JBPM的事务.
      如果你用SPRING来托管事务,那你就要把SERVICE的接口赋予相应的事务。
      无论事务怎么用,只要将相应的事务?权限?赋予 这个处理方法就行了,我遇到的就是这问题,你试试喽.