使用原因:使用@Autowired不能注入TaskService,原因好像是创建ExecutionListener 是反射创建的原因,不是spring管理的。
第一步:定义一个类实现ApplicationContextAware,代码如下
@Component
public class ApplicationContextHandler implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ApplicationContextHandler.applicationContext = applicationContext;
}
//此种方式在使用taskService名字获取bean时找不到,可自己试试其他名字。
public static Object getBean(String name) {
return ApplicationContextHandler.applicationContext.getBean(name);
}
public static <T> T getBean(Class<T> clazz) {
return applicationContext.getBean(clazz);
}
public static ApplicationContext getApplicationContext() {
return ApplicationContextHandler.applicationContext;
}
}
第二步:在监听器中获取你所需要的Bean,代码如下:
public class EventSelfProcessingExecutionListener implements ExecutionListener {
@Override
public void notify(DelegateExecution execution) {
TaskService taskService = ApplicationContextHandler.getBean(TaskService.class);
Task task = taskService.createTaskQuery().taskDefinitionKey(EventConstant.YOURSELF_TODO).
processInstanceId(execution.getProcessInstanceId()).singleResult();
execution.setVariable("fillInInformationUser", task.getAssignee());
}
}
注意点:TaskService不能通过getBean(String name)获取,bean的名字似乎不叫taskService,应该使用class来获取TaskService获取。以上是踩坑一小时的经验。