WebLogic部署Spring Boot应用报错:无法找到CDI BeanManager如何解决?
解决Spring Boot部署WebLogic时CDI BeanManager找不到的问题
需要修改的配置文件及具体方案
1. web.xml
添加CDI BeanManager的资源引用,让容器能正确定位到BeanManager实例:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!-- 添加CDI BeanManager资源引用 --> <resource-ref> <description>CDI BeanManager</description> <res-ref-name>BeanManager</res-ref-name> <res-type>javax.enterprise.inject.spi.BeanManager</res-type> <res-auth>Container</res-auth> <lookup-name>java:comp/BeanManager</lookup-name> </resource-ref> </web-app>
2. weblogic.xml
调整类加载优先级,避免应用打包的CDI API与WebLogic自带实现冲突,同时开启WebInf类优先加载:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE wls:weblogic-web-app [ <!ELEMENT wls:weblogic-web-app (wls:context-root|wls:container-descriptor)*> <!ATTLIST wls:weblogic-web-app xmlns:wls CDATA #REQUIRED xmlns:xsi CDATA #REQUIRED xsi:schemaLocation CDATA #REQUIRED> <!ELEMENT wls:context-root (#PCDATA)> <!ELEMENT wls:container-descriptor (wls:prefer-application-packages|wls:prefer-web-inf-classes)*> <!ELEMENT wls:prefer-application-packages (wls:package-name)*> <!ELEMENT wls:package-name (#PCDATA)> <!ELEMENT wls:prefer-web-inf-classes (#PCDATA)> ]> <wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd"> <wls:container-descriptor> <wls:prefer-application-packages> <wls:package-name>org.slf4j</wls:package-name> <!-- 排除应用打包的CDI相关包,使用WebLogic自带实现 --> <wls:package-name>javax.enterprise.inject.*</wls:package-name> <wls:package-name>javax.enterprise.context.*</wls:package-name> </wls:prefer-application-packages> <!-- 开启WebInf类优先加载,确保配置被正确识别 --> <wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes> </wls:container-descriptor> </wls:weblogic-web-app>
3. pom.xml
- 移除重复的
spring-boot-starter-tomcat依赖 - 将
cdi-api的scope改为provided,依赖WebLogic自带的CDI实现,避免打包冲突
修改后的依赖部分:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>javax.enterprise</groupId> <artifactId>cdi-api</artifactId> <version>1.2</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.28</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
原因说明
- web.xml的资源引用让WebLogic容器直接定位到内置的BeanManager实例
- weblogic.xml的类加载调整避免了CDI API的版本冲突,确保容器优先使用自身的CDI组件
- pom.xml的依赖修改减少了打包后的冗余,让应用正确依赖WebLogic提供的CDI运行环境
内容的提问来源于stack exchange,提问作者Mansi Adroja
相关产品推荐
相关产品推荐

