转自: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'....................

异常分析:

图例:

JBPM4 No unnamed transitions were found for the task

 

这种问题一般在初学者中容易出现,原因是我们的流程在定义的时候有一个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);