Jersey 1升级至Jersey 2(含Spring插件)适配JDK1.8遇错求助
问题分析与解决方案
我来帮你一步步拆解当前遇到的两个核心问题,给出针对性的解决思路:
一、Jersey 1.8 在 JDK 1.8 + JBoss EAP 6.4 下的响应绑定错误(AbstractMethodError)
问题根源
你碰到的java.lang.AbstractMethodError主要有两个原因:
- Jersey 1.8依赖的Jackson版本(1.9.9.redhat-4)与JDK 1.8存在兼容性问题,无法适配JDK 1.8的新特性;
- JBoss EAP 6.4自带的Jackson模块和应用内的Jackson版本产生了类加载冲突。
另外,Jersey 1.x系列本身是为JDK 1.6/1.7设计的,官方早已停止维护,对JDK 1.8的支持先天不足。
临时解决方案(若坚持使用Jersey 1.8)
- 升级Jackson兼容版本:将Jackson依赖升级到JDK 1.8兼容的1.9.x分支(如1.9.13),确保和Jersey 1.8兼容。在POM中更新:
<dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-asl</artifactId> <version>1.9.13</version> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.13</version> </dependency>
- 排除JBoss自带Jackson模块:在项目根目录添加
jboss-deployment-structure.xml,强制应用使用自身打包的Jackson版本:
<jboss-deployment-structure> <deployment> <exclusions> <module name="org.codehaus.jackson.jackson-core-asl"/> <module name="org.codehaus.jackson.jackson-mapper-asl"/> </exclusions> </deployment> </jboss-deployment-structure>
注意:这只是临时 workaround,长远来看强烈建议升级到Jersey 2.x。
二、升级Jersey 2.4.1后出现的NoSuchMethodError: javax.ws.rs.core.Application.getProperties()
问题根源
JBoss EAP 6.4默认自带的是JAX-RS 1.1规范(对应jsr311-api),而Jersey 2.x必须依赖JAX-RS 2.0规范。尽管你在POM中引入了jboss-jaxrs-api_2.0_spec,但JBoss的模块加载优先级高于应用依赖,程序依然使用了服务器自带的旧版API——旧API的Application类并没有getProperties()方法,因此抛出异常。
解决方案
- 排除JBoss自带JAX-RS模块:创建/修改
jboss-deployment-structure.xml,阻止服务器加载自带的JAX-RS相关模块,让应用使用自身打包的JAX-RS 2.0 API:
<jboss-deployment-structure> <deployment> <exclusions> <module name="javax.ws.rs.api"/> <module name="org.jboss.resteasy.resteasy-jaxrs"/> </exclusions> </deployment> </jboss-deployment-structure>
- 彻底清理旧版JAX-RS依赖:通过
mvn dependency:tree排查所有依赖,确保任何引入jsr311-api的依赖都被排除。比如针对axis2-transport-local,在POM中添加排除规则:
<dependency> <groupId>org.apache.axis2</groupId> <artifactId>axis2-transport-local</artifactId> <!-- 其他配置 --> <exclusions> <exclusion> <groupId>javax.ws.rs</groupId> <artifactId>jsr311-api</artifactId> </exclusion> </exclusions> </dependency>
- 修正JBoss模块配置:你之前注释
module.xml中的resteasy-jaxrs依赖导致模块找不到,是因为应用原本依赖了服务器的JAX-RS模块。现在我们已经排除了服务器的JAX-RS模块,应该移除module.xml中相关的resteasy配置,让Jersey 2.x自行管理依赖。
长远优化方案
如果条件允许,建议直接升级到JBoss EAP 7.x版本:
- EAP 7.x原生支持JDK 1.8和JAX-RS 2.0规范,与Jersey 2.x的兼容性极佳,能彻底避免这类依赖冲突;
- EAP 7.x的性能、稳定性比6.4更优,更适配JDK 1.8的运行环境。
内容的提问来源于stack exchange,提问作者Visagan
相关产品推荐
相关产品推荐

