JBPM4 No unnamed transitions were found for the task 'XXXX'

本文分析了在JBPM4中使用TaskService完成任务时遇到的Nounnamedtransitionswerefoundforthetask异常,并提供了详细的解决方法。针对不同流程定义的情况,介绍了如何正确调用TaskService的completeTask方法。

转自: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); 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值