在我们用ServiceTask,为的目的就是想要在流程进行到某个节点的时候,调用我们自己写的业务逻辑,这时候一般我们就会设置ServiceTask的implementation属性为Java Class,然后值填写为本地调用的回调类的全局路径,如下图
然后回调类
@Component
public class QuitWorkCallBackController implements JavaDelegate {
@Autowired
private IQuitService quitService;
@Override
public void execute(DelegateExecution delegateExecution) throws Exception {
//获取审批条件,是否有不同意的,只有所有审批人都同意,才修改数据组状态,否则则判断失败
boolean isOk = (boolean) delegateExecution.getVariable("isOk");
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("task_id",delegateExecution.getId());
Quit quit = quitService.getOne(queryWrapper);
if (isOk){
//如果通过,则修改状态为成功
quit.setApplyStatus(2);
}else {
//不成功则更新状态为失败
quit.setApplyStatus(3);
}
//再执行更新
quitService.updateById(quit);
}
}
到此,本来如果是按照预想,当流程走到该回调类的时候,应该会执行更新数据库记录的操作,但是执行结果却是报错,报NullException,然后打断点调试,发现Service并没有注入进来
所以会报NullException,然后在此之后,笔者也试过很多其他的注入方式,然而结果都一致,也是一样报NullException。最后实在没办法,在网上寻找答案,然后偶然看到了一篇文章,
就有了灵感。
解决办法如下:
如果想在Camunda的ServiceTask的回调类中,让SpringBoot自动注入你想要的Service,那么一开始就需要设置ServiceTask的implementation属性为Delegate Expression,且对应的值要填写为Bean的Name,如下图
然后对应的回调类修改为
@Service("QuitAct")
public class QuitWorkCallBackController implements JavaDelegate {
@Autowired
private IQuitService quitService;
@Override
public void execute(DelegateExecution delegateExecution) throws Exception {
//获取审批条件,是否有不同意的,只有所有审批人都同意,才修改数据组状态,否则则判断失败
boolean isOk = (boolean) delegateExecution.getVariable("isOk");
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("task_id",delegateExecution.getId());
Quit quit = quitService.getOne(queryWrapper);
if (isOk){
//如果通过,则修改状态为成功
quit.setApplyStatus(2);
}else {
//不成功则更新状态为失败
quit.setApplyStatus(3);
}
//再执行更新
quitService.updateById(quit);
}
}
然后我们再次进行测试,就会发现
Service就可以成功的注入进来!!!下面的业务流程代码也可以执行成功,且正常结束流程!!!
最后总结:
当你流程的ServiceTask业务流程回调类需要调用到Spring boot的bean的时候,请将ServiceTask的implementation属性为Delegate Expression,且对应的值要填写为Bean的Name,这样回调类才可以自动注入Bean,否则会因为Bean无法注入而报NullException错误!!!
注:此篇仅用于总结自己犯下的错误,如果有什么其他的解决方式或者更好的解决方式,甚至文章错误欢迎在评论区提出。