You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 03:30:45