You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Resteasy 3.9.0项目中如何强制API使用FasterXML ObjectMapper解析POJO

问题:Resteasy 3.9.0.Final强制使用FasterXML Jackson解析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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 08:02:50