如何在Activiti JavaDelegate类中获取Spring Bean对象?
解决Activiti JavaDelegate中Spring Bean注入为null的问题
问题原因
Activiti默认会自行实例化JavaDelegate实现类,而非从Spring容器中获取实例,导致Spring的@Autowired依赖注入无法生效,因此tempService对象为null。
解决方案
1. 配置Activiti与Spring集成,使用Spring容器管理Delegate实例
确保Activiti流程引擎使用SpringProcessEngineConfiguration并关联Spring上下文,让Activiti从Spring容器中获取Bean实例:
@Configuration public class ActivitiConfig { @Bean public SpringProcessEngineConfiguration springProcessEngineConfiguration(DataSource dataSource, PlatformTransactionManager transactionManager, ApplicationContext applicationContext) { SpringProcessEngineConfiguration config = new SpringProcessEngineConfiguration(); config.setDataSource(dataSource); config.setTransactionManager(transactionManager); config.setDatabaseSchemaUpdate("true"); // 绑定Spring上下文,让Activiti使用Spring容器获取Bean config.setApplicationContext(applicationContext); return config; } @Bean public ProcessEngine processEngine(SpringProcessEngineConfiguration config) { return config.buildProcessEngine(); } }
2. 修改BPMN文件中ServiceTask的引用方式
不要用activiti:class指定全类名,改用activiti:delegateExpression引用Spring Bean的名称:
<!-- 错误写法 --> <serviceTask id="dataServiceTask" activiti:class="com.example.DataService"/> <!-- 正确写法 --> <serviceTask id="dataServiceTask" activiti:delegateExpression="${dataService}"/>
注:dataService是DataService类的Spring Bean默认名称(因@Component注解,默认取类名首字母小写)。
3. 确保Spring能扫描到目标Bean
检查DataService和TempServiceImpl所在的包是否在Spring组件扫描范围内,比如启动类的@SpringBootApplication或配置类的@ComponentScan是否覆盖了这些包路径。
备选方案(不推荐):手动从Spring上下文获取Bean
如果暂时无法修改BPMN或Activiti配置,可以在execute方法中手动获取Bean:
@Component public class DataService implements JavaDelegate { @Override public void execute(DelegateExecution execution) { VariableInstance instance = execution.getParent().getVariableInstances().get("info"); User user = (User) instance.getValue(); System.out.println("Name: "+user.getUserName()); // 手动获取Spring Bean TempServiceImpl tempService = ApplicationContextProvider.getApplicationContext().getBean(TempServiceImpl.class); tempService.getData(user.getUserName()); System.out.println("Working fine...."); } }
需先实现上下文工具类:
@Component public class ApplicationContextProvider implements ApplicationContextAware { private static ApplicationContext context; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { context = applicationContext; } public static ApplicationContext getApplicationContext() { return context; } }
内容的提问来源于stack exchange,提问作者Atul
相关产品推荐
相关产品推荐

