前几天在处理activi6流程时,遇到如下问题。在Task设置了监听之后,通过注入spring bean去修改数据库相关状态时,发现bean一直报空。
之前的写法如下:
@Slf4j @Service("checkStatusUpdateTask") @Component @ApiModel(discriminator = "sun jie 2019/4/1 0001 15:32", description = "修改二号成本表审批状态_自动任务", value = "CheckStatusUpdateTask") public class CheckStatusUpdateTask implements JavaDelegate { @Autowired private BagOrderService bagOrderService; @Override public void execute(DelegateExecution execution) { //bagOrderService的相关修改逻辑 } }
此时,调试bagOrderService一直为null,后来翻阅相关资料,发现activiti于spring bean不在同一个实例中,故无法通过spring注入方式加载bean。
解决思路:
通过springContext去获取实例下的bagOrderService的bean,进而去处理逻辑。
修改代码:
@Slf4j @Service("checkStatusUpdateTask") @Component @ApiModel(discriminator = "sun jie 2019/4/1 0001 15:32", description = "修改二号成本表审批状态_自动任务", value = "CheckStatusUpdateTask") public class CheckStatusUpdateTask implements JavaDelegate { @Override public void execute(DelegateExecution execution) { //获取实例下的bagOrderService的bean BagOrderService bagOrderService = (BagOrderService) SpringContextUtils.getContext().getBean("bagOrderService"); //bagOrderService的相关修改逻辑 } }
spring上下文可自己去实现,下面提供spring boot的写法参考:
工具类:
@ApiModel(discriminator = "sun jie 2019/4/14 0014 0:32", description = "获取容器上下文", value = "SpringContextUtils") public class SpringContextUtils implements ApplicationContextAware { private static ApplicationContext context; public static ApplicationContext getContext() { return context; } @Override public void setApplicationContext(ApplicationContext context) throws BeansException { SpringContextUtils.context = context; } }
配置类,容器初始化时装载变量:
@Configuration public class WebConfiguration implements WebMvcConfigurer { @Bean SpringContextUtils getSpringContextUtils() { return new SpringContextUtils(); } }