【问题标题】:Update Jersey Jackson's Mapper config at runtime在运行时更新 Jersey Jackson 的 Mapper 配置
【发布时间】:2017-07-17 12:00:34
【问题描述】:

我有一个客户端应用程序,我正在使用它来使用一些 API 并对其进行更新。我正在使用带有 Jersey Jackson 的 Jersey 2.25.1,没有自定义连接器,只是基本设置。

我有一个 POJO,我正在使用 Jackson 和 Jersey 进行序列化,但我需要以两种方式对这个 POJO 进行序列化,首先是在序列化它们时包含所有 null 值,其次是忽略和删除 null 字段。

这就是 API 的工作方式,因此无法更改 API(这不是我的 API),所以我问我可以在运行时更新 Jersey Jackson Mapper 吗?

我正在寻找的是这样的:

 Client client = ClientBuilder.newBuilder()
            .register(JacksonFeature.class)
            .build();
 client.getJacksonObjectMapper().setSerializationInclusion(Include.NON_NULL); 

【问题讨论】:

    标签: java json serialization jersey jackson


    【解决方案1】:

    您可以使用ContextResolver,并在那里配置ObjectMapper。 Jackson 提供程序将调用上下文解析器以获取 ObjectMapper

    class JacksonResolver implements ContextResolver<ObjectMapper> {
        private final ObjectMapper mapper = new ObjectMapper();
    
        public JacksonResolver() {
            // configure mapper
        }
    
        @Override
        public ObjectMapper resolve(Class<?> cls) {
            return this.mapper;
        }
    }
    
    Client client = ClientBuilder.newBuilder()
            .register(JacksonFeature.class)
            .register(new JacksonResolver())
            .build();
    

    【讨论】:

    • 这个可以在客户端创建后进行吗?我的意思是在运行时有条件地?
    • 没有。您将获得的最好的结果是每个模型类。将要序列化的类传递给getContext 方法,您可以有条件地决定在那里使用哪个映射器,但仅此而已。除此之外,映射器实际上不应该像那样基于条件进行配置,因为它的配置不是线程安全的。您可能只需要为不同的场景创建不同的客户端。
    • 是的,看来我需要创建另一个客户端然后@peeskillet
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-08
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多