Resteasy 3.9.0项目中如何强制API使用FasterXML ObjectMapper解析POJO
场景说明
我们在普通Java项目中使用Resteasy 3.9.0.Final,有一个API方法用于读取基于com.fasterxml.jackson.core:jackson-annotations:2.10.0编写的POJO(Request类),API方法代码如下:
@Override @POST @GZIP @Path("/api") public Response call( @HeaderParam("host") @ApiParam(value = "host", required = true) String hostName, @ApiParam(value = "", required = true) Request request) {
问题现象
调用API时触发反序列化错误,错误信息显示CodeHaus Jackson无法识别字段:
“detailedErrorMessage”: “{\"messageDetails\":\"Unrecognized field \\\"id\\\" (Class com.abc.api.platform.xyz.pqr), not marked as ignorable\\n at [Sou at org.codehaus.jackson.map.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:53) at org.codehaus.jackson.map.deser.StdDeserializationContext.unknownFieldException(StdDeserializationContext.java:267) at org.codehaus.jackson.map.deser.std.StdDeserializer.reportUnknownProperty(StdDeserializer.java:673) at org.codehaus.jackson.map.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:659)
但如果手动把请求内容读取为字符串,再用Fasterxml的ObjectMapper转换为Request类,就能正常运行。现在需要让API方法强制使用FasterXML ObjectMapper,而非CodeHaus Jackson来解析POJO。
当前项目依赖树
[INFO] +- org.jboss.resteasy:resteasy-jackson-provider:jar:3.9.0.Final:compile [INFO] | +- org.codehaus.jackson:jackson-mapper-asl:jar:1.9.13:compile [INFO] | +- org.codehaus.jackson:jackson-jaxrs:jar:1.9.13:compile [INFO] | \- org.codehaus.jackson:jackson-xc:jar:1.9.13:compile org.codehaus.jackson:jackson-core-asl:jar:1.9.13:compile org.codehaus.mojo:build-helper-maven-plugin:maven-plugin:3.3.0:compile
解决方案
1. 替换Resteasy的Jackson Provider
移除基于CodeHaus Jackson的resteasy-jackson-provider,换成针对FasterXML Jackson的resteasy-jackson2-provider:
在Maven依赖中添加:
<dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-jackson2-provider</artifactId> <version>3.9.0.Final</version> </dependency>
如果resteasy-jackson-provider是通过其他依赖间接引入的,需要手动排除:
<dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-jaxrs</artifactId> <version>3.9.0.Final</version> <exclusions> <exclusion> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-jackson-provider</artifactId> </exclusion> </exclusions> </dependency>
2. 注册自定义ObjectMapper(可选)
如果需要自定义反序列化规则(比如忽略未知字段),可以创建一个ContextResolver来提供自定义的Fasterxml ObjectMapper:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.DeserializationFeature; import javax.ws.rs.ext.ContextResolver; import javax.ws.rs.ext.Provider; @Provider public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> { private final ObjectMapper mapper; public ObjectMapperContextResolver() { mapper = new ObjectMapper(); // 配置忽略未知字段,解决当前报错问题 mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 可添加其他自定义配置 } @Override public ObjectMapper getContext(Class<?> type) { return mapper; } }
确保这个类被Resteasy扫描到,比如通过web.xml配置或者Spring组件扫描(如果项目用Spring的话)。
3. 清理CodeHaus Jackson依赖
重新生成依赖树,确认所有CodeHaus Jackson相关的jar包(jackson-core-asl、jackson-mapper-asl等)都已被排除或移除,避免依赖冲突。
内容的提问来源于stack exchange,提问作者Mehul Parmar

