JBPM4 No unnamed transitions were found for the task 'XXXX'
转自:http://hi.baidu.com/thinkhlin/blog/item/971d4dc6a2b181049c163d0b.html
JBPM4执行taskService.completeTask(taskId,map)或taskService.completeTask(taskId) 操作时,出现异常:
No unnamed transitions were found for the task 'XXXX'....................
异常分析:
图例:
这种问题一般在初学者中容易出现,原因是我们的流程在定义的时候有一个transitions属性节点,这个默认是有一个名称的如图例中“to 申请请假”这个箭头表示流程的流向,如果我们直接使用taskService.completeTask(taskId,map) 或taskService.completeTask(taskId) ,则出现上面的那个异常,如果流向图很简单的话,我们可以直接将箭头的名字删除即可,但是,我们更多的是有多条线的情况,那样的话我们可以taskService.completeTask(taskId,"to 申请请假");这样的方式来完成。
-------------------------------------------------------------------------------------------------------------------------------------------------------------
考虑再三还是把参考中的原因分析写上吧,这样会更完整些,方便查看,省的各种查找了:
原理分析:
1.如果一个任务拥有一个没用名称的外向转移:
//返回包含一个null值集合,。 taskService.getOutcomes() //会使用这个外向转移。 taskService.completeTask(taskId) //会使用这个外向转移。 taskService.completeTask(taskId, null) //会抛出一个异常。 taskService.completeTask(taskId, "anyvalue")
2.如果一个任务拥有一个有名字的外向转移:
//返回包含这个转移名称的集合。 taskService.getOutcomes() // 会使用这个单独的外向转移。 taskService.completeTask(taskId) //会抛出一个异常(因为这里没有无名称的转移)。 taskService.completeTask(taskId, null) //会抛出一个异常。 taskService.completeTask(taskId, "anyvalue") // 会根据给定的名称使用转移。 taskService.completeTask(taskId, "myName")
3.如果一个任务拥有多个外向转移,其中一个转移没有名称,其他转移都有名称:
//返回包含一个null值和其他转移名称的集合。 taskService.getOutcomes() //会使用没有名字的转移。 taskService.completeTask(taskId) //会使用没有名字的转移。 taskService.completeTask(taskId, null) //会抛出异常。 taskService.completeTask(taskId, "anyvalue") //会使用名字为'myName'的转移。 taskService.completeTask(taskId, "myName")
4.如果一个任务拥有多个外向转移,每个转移都拥有唯一的名字:
//返回包含所有转移名称的集合 taskService.getOutcomes() //会抛出异常,因为这里没有无名称的转移。 taskService.completeTask(taskId) //会抛出异常,因为这里没有无名称的转移 taskService.completeTask(taskId, null) //会抛出异常 taskService.completeTask(taskId, "anyvalue") //会使用名字为'myName'的转移 taskService.completeTask(taskId, "myName")
解决方案:
根据以上分析,可得到解决方案:
1、只拥有一个外向转移时(对应上文所述1、2情况):
Map map = new HashMap();map.put("",……) //各种参数 taskService.setVariables(taskId,map); taskService.completeTask(taskId);
2、拥有多个外向转移时(上文3、4种情况):
Map map = new HashMap();map.put("",……) //各种参数 taskService.setVariables(taskId,map); //如想转移至有名称的外向转移: taskService.completeTask(taskId,"外向转移名称"); //如想转移至无名称的外向转移: taskService.completeTask(taskId);