WebLogic 12.1.3替换Jersey版本引发类型转换异常求助
解决WebLogic 12.1.3替换Jersey版本引发的ClassCastException问题
这个报错我太熟悉了!核心原因就是类加载器冲突——WebLogic自带的Jersey 1.18和你打包进WAR的Jersey 1.19,分别被不同的类加载器加载了WebApplicationProvider接口及其实现类,JVM会把它们当成完全不同的类型,自然就抛出类型转换异常了。下面给你一套可行的解决步骤:
第一步:配置WebLogic优先加载应用内的Jersey类
WebLogic默认会优先加载自身库中的类,所以我们需要通过weblogic.xml强制改变类加载优先级。在你的WAR包的WEB-INF目录下创建(如果已有则修改)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.7/weblogic-web-app.xsd"> <container-descriptor> <prefer-application-packages> <!-- 让WebLogic优先使用应用内的Jersey相关类 --> <package-name>com.sun.jersey.*</package-name> <!-- 同时覆盖JAX-RS的API包,避免API版本冲突 --> <package-name>javax.ws.rs.*</package-name> </prefer-application-packages> </container-descriptor> </weblogic-web-app>第二步:清理WAR包中的冗余JAR,避免重复类
你打包的jersey-bundle-1.19.jar已经包含了jersey-core、jersey-server等核心模块的所有类,同时再打包jersey-core-1.19.jar、jersey-server-1.19.jar会导致重复类存在,反而加重类加载混乱。建议:- 如果是手动打包,只保留
jersey-bundle-1.19.jar、jersey-client-1.19.jar和jersey-json-1.19.jar(如果业务确实需要客户端和JSON支持) - 如果用Maven/Gradle管理依赖,记得排除
jersey-bundle依赖中已包含的模块,比如在Maven中:<dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-bundle</artifactId> <version>1.19</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-client</artifactId> <version>1.19</version> <exclusions> <exclusion> <groupId>com.sun.jersey</groupId> <artifactId>jersey-core</artifactId> </exclusion> </exclusions> </dependency>
- 如果是手动打包,只保留
第三步:验证类加载情况(可选但推荐)
配置完成后,你可以通过WebLogic控制台确认类加载是否生效:- 登录WebLogic控制台,进入你的应用部署详情页面
- 切换到「类加载器」标签页,查看应用类加载器的加载顺序,确认优先加载了你打包的Jersey JAR
- 如果问题依旧,可以添加JVM启动参数
-verbose:class,启动WebLogic后会打印每个类的加载来源,能精准定位哪个类还是从WebLogic自带库中加载的。
另外补充一点:WebLogic 12.1.3对JAX-RS组件有特定的兼容性约束,确保你的web.xml中配置的Jersey Servlet是1.19版本的实现类,比如:
<servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>your.rest.package</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
内容的提问来源于stack exchange,提问作者alberto
相关产品推荐
相关产品推荐

