WebLogic 12.2.1.3替换内置hibernate-validator后API调用报错求助
问题描述
WebLogic Server版本:12.2.1.3.0
使用WebLogic内置的hibernate-validator运行正常,但替换为Jar包提供的hibernate-validator(版本5.4.1.Final)后,调用API时出现类型转换异常。已尝试在weblogic.xml中配置prefer-application-packages,但异常依旧。
当前配置
pom.xml依赖
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator-cdi</artifactId> <version>5.4.1.Final</version> </dependency>
weblogic.xml配置
<?xml version="1.0" encoding="UTF-8"?> <weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.8/weblogic-web-app.xsd"> <jsp-descriptor> <keepgenerated>true</keepgenerated> <debug>true</debug> </jsp-descriptor> <context-root>awesome-api</context-root> <container-descriptor> <prefer-application-packages> <package-name>org.slf4j.*</package-name> <package-name>org.apache.commons.logging.*</package-name> <package-name>org.hibernate.*</package-name> <package-name>javax.validation.*</package-name> </prefer-application-packages> <prefer-application-resources> <resource-name>org/slf4j/impl/StaticLoggerBinder.class</resource-name> </prefer-application-resources> </container-descriptor> </weblogic-web-app>
错误信息
java.lang.IllegalArgumentException: Can not set javax.validation.Validator field org.hibernate.validator.internal.cdi.interceptor.ValidationInterceptor.validator to org.jboss.weld.proxies.ExecutableValidator$Validator$976505265$Proxy$_$$_WeldClientProxy at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167) at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171) at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81) at java.lang.reflect.Field.set(Field.java:764) at org.jboss.weld.injection.FieldInjectionPoint.inject(FieldInjectionPoint.java:94) ...(省略后续栈跟踪)
问题原因
- 类加载范围过度宽泛:配置
org.hibernate.*会强制WebLogic加载应用中所有Hibernate包,与WebLogic内置的Hibernate JPA组件产生类加载冲突,导致javax.validation.Validator接口的实例来自不同类加载器,无法完成类型转换。 - 依赖不完整:仅引入
hibernate-validator-cdi但缺少核心的hibernate-validator依赖,容器被迫混合使用内置与应用中的组件,引发类型不匹配。
解决方案
1. 细化包加载优先级配置
修改weblogic.xml中的prefer-application-packages,仅指定hibernate-validator相关包,避免影响其他Hibernate组件:
<prefer-application-packages> <package-name>org.slf4j.*</package-name> <package-name>org.apache.commons.logging.*</package-name> <!-- 仅加载应用中的hibernate validator相关包 --> <package-name>org.hibernate.validator.*</package-name> <package-name>org.hibernate.validator.cdi.*</package-name> <package-name>javax.validation.*</package-name> <package-name>javax.validation.spi.*</package-name> </prefer-application-packages>
2. 补充完整依赖
在pom.xml中添加核心依赖,确保组件版本一致:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.4.1.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator-cdi</artifactId> <version>5.4.1.Final</version> </dependency> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.1.0.Final</version> <scope>provided</scope> </dependency>
3. 优先加载验证服务配置文件
在prefer-application-resources中添加Bean Validation的服务配置,确保容器使用应用中的实现:
<prefer-application-resources> <resource-name>org/slf4j/impl/StaticLoggerBinder.class</resource-name> <resource-name>META-INF/services/javax.validation.ValidationProvider</resource-name> </prefer-application-resources>
4. 清理并重新部署
- 删除WebLogic服务器临时目录(如
domain/servers/your_server/tmp) - 重新打包应用并部署到WebLogic
内容的提问来源于stack exchange,提问作者hhyygg2009
相关产品推荐
相关产品推荐

