Spring Boot无法注入CDI Bean,添加CdiBeanFactoryPostProcessor报类找不到
嘿,我来帮你搞定这个Spring Boot没法注入CDI Bean的问题!你遇到的ClassNotFoundException其实是核心问题——你缺了CDI和Spring集成的依赖包,org.cdisource.springintegration.CdiBeanFactoryPostProcessor这个类属于cdi-spring-integration库,没引入的话Spring肯定找不到它。而且Spring本身对CDI的原生支持有限,得额外配置才能让两者好好配合。
具体解决步骤
1. 先补上缺失的依赖
首先得在你的构建文件里加入CDI-Spring集成的依赖,分Maven和Gradle两种情况:
Maven(pom.xml):
<dependency> <groupId>org.cdisource</groupId> <artifactId>cdi-spring-integration</artifactId> <version>1.0.0</version> </dependency>
Gradle(build.gradle):
implementation 'org.cdisource:cdi-spring-integration:1.0.0'
小提醒:这个版本适配Spring 3.x/4.x和CDI 1.0,如果你的Spring Boot是2.x及以上版本,可能得找找适配的新版本,或者试试后面的替代方案。
2. 配置Spring上下文
依赖加好之后,你之前写的<bean class="org.cdisource.springintegration.CdiBeanFactoryPostProcessor" />就能正常工作了!这个后置处理器会把CDI容器里的Bean都注册到Spring上下文里,这样Spring就能识别并注入这些CDI Bean了。
3. 版本不兼容?试试手动注册方案(适合Spring Boot 2.x+)
如果上面的集成库版本跟不上你的Spring Boot,那可以试试手动把CDI Bean注册到Spring里:
先写个配置类,获取CDI的BeanManager,再手动注册需要的Bean:
import javax.enterprise.inject.spi.BeanManager; import javax.naming.InitialContext; import javax.naming.NamingException; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class CdiBeanConfig { @Bean public BeanManager beanManager() throws NamingException { // 从JNDI获取CDI的BeanManager return (BeanManager) new InitialContext().lookup("java:comp/BeanManager"); } // 把你需要的CDI Bean注册到Spring @Bean public YourCdiBean yourCdiBean(BeanManager beanManager) { return (YourCdiBean) beanManager.getReference( beanManager.resolve(beanManager.getBeans(YourCdiBean.class)), YourCdiBean.class, beanManager.createCreationalContext(null) ); } }
之后你就能在Spring的组件里用@Autowired或者@Inject来注入YourCdiBean啦。
4. 几个要注意的点
- 你的CDI Bean得符合CDI规范,比如带上
@Named、@Singleton这类CDI注解,不然CDI容器不会管理它。 - 如果你的Spring Boot是打包成WAR部署到支持CDI的容器(比如WildFly、TomEE),容器会自带CDI环境;但如果是Jar包直接运行,得额外加CDI实现的依赖,比如Weld:
<dependency> <groupId>org.jboss.weld.se</groupId> <artifactId>weld-se-core</artifactId> <version>3.1.9.Final</version> </dependency>
总结
先把缺失的依赖补上,配置好后置处理器;要是版本不兼容,就用手动注册Bean的方式。这样Spring Boot就能顺利注入CDI创建的Bean了!
内容的提问来源于stack exchange,提问作者lokesh nirmalker

