Camunda 使用 ServiceTask 的JavaClass属性导致Spring Boot @Autowired 注入为空的解决办法

本文讲述了在Camunda流程中使用ServiceTask调用自定义业务逻辑时遇到的NullPointerException问题。作者发现设置implementation属性为JavaClass导致SpringBoot的Service无法注入。解决方案是将implementation改为DelegateExpression,并指定Bean的Name。按照这个方法,Service成功注入,流程得以正常执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        在我们用ServiceTask,为的目的就是想要在流程进行到某个节点的时候,调用我们自己写的业务逻辑,这时候一般我们就会设置ServiceTaskimplementation属性为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,那么一开始就需要设置ServiceTaskimplementation属性为Delegate Expression,且对应的值要填写为BeanName,如下图

           

               然后对应的回调类修改为

@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错误!!!

       

 

       注:此篇仅用于总结自己犯下的错误,如果有什么其他的解决方式或者更好的解决方式,甚至文章错误欢迎在评论区提出。
                    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值