Resteasy 2.3.6不同环境Provider加载顺序异常导致JSON解析失败
问题根因
即使OpenJDK版本完全一致,ServiceLoader加载META-INF/services/javax.ws.rs.ext.Providers资源的顺序也不固定,该顺序由以下变量共同决定:
- 操作系统的文件系统遍历逻辑:不同系统(Windows/Linux)、不同文件系统(ext4/xfs/NTFS)返回目录下jar包列表的排序规则不同
- 运行环境的类加载器实现:本地IDE启动、独立Tomcat、JBoss等容器的类加载器扫描jar包的逻辑存在差异
- 部署包的构建规则:不同打包环境下
WEB-INF/lib目录下jar包的写入顺序也可能不同
你遇到的问题正是因为远程环境下Jettison的JettisonXmlRootElementProvider先于Jackson的ResteasyJacksonProvider被加载注册,Jettison基于JAXB实现JSON解析,要求目标DTO标注@XmlRootElement且JSON根元素匹配注解声明的名称,因此抛出了结构不匹配的解析异常。
解决方案
按优先级从高到低推荐以下方案:
- 显式指定Provider优先级
手动注册ResteasyJacksonProvider并设置更高优先级:- 如果用
web.xml配置,添加如下参数:
<context-param> <param-name>resteasy.providers</param-name> <param-value>org.jboss.resteasy.plugins.providers.jackson.ResteasyJacksonProvider</param-value> </context-param>- 如果用
Application类注册,直接在返回的Provider类集合中加入该类,同时可以标注@Priority(100)注解(优先级数值越小优先级越高,内置Provider默认优先级通常为500以上)。
- 如果用
- 排除无用的Jettison依赖
如果项目不需要JAXB方式的JSON解析能力,直接在构建配置中排除resteasy-jettison-provider相关依赖,类路径下不存在Jettison的Provider,自然会使用Jackson的Provider完成解析。 - 容器级Provider排除(针对JBoss/Wildfly等内置Resteasy的容器)
在WEB-INF下添加jboss-deployment-structure.xml,排除容器内置的Jettison模块,强制使用应用打包的Jackson Provider:<jboss-deployment-structure> <deployment> <exclusions> <module name="org.jboss.resteasy.resteasy-jettison-provider" /> </exclusions> </deployment> </jboss-deployment-structure>
内容的提问来源于stack exchange,提问作者denis
相关产品推荐
相关产品推荐

