在泽西岛使用Jackson配置多个ObjectMappers

 木色雪魂K 发布于 2023-01-15 15:10

是否可以使用Jackson设置Jersey以使用多个配置进行序列化/反序列化ObjectMappers

我希望能够做的是注册一个"默认"杰克逊ObjectMapper,然后能够注册另一个功能,提供ObjectMapper一些特殊配置,在某些情况下将"覆盖""默认" ObjectMapper.

例如,这ContextResolver将是"默认"映射器:

@Provider
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class JacksonMapperProvider implements ContextResolver {
    private final ObjectMapper mObjectMapper;

    public JacksonMapperProvider() {
        mObjectMapper = createMapper();
    }

    protected abstract ObjectMapper createMapper() {
        ObjectMapper mapper = createMapper();

        return mapper
            .setSerializationInclusion(Include.ALWAYS)
            .configure(JsonParser.Feature.ALLOW_COMMENTS, true)
            .configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true)
            .configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true)
            .configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
    }

    @Override
    public ObjectMapper getContext(Class type) {
        return mObjectMapper;
    }
}

ContextResolver将覆盖"默认"映射器:

@Provider
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class SpecializedMapperProvider implements ContextResolver {
    private final ObjectMapper mObjectMapper;

    public SpecializedMapperProvider() {
        mObjectMapper = createMapper();
    }

    protected abstract ObjectMapper createMapper() {
        ObjectMapper mapper = createMapper();

        return mapper
            .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
            .setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"))
            .registerModule(new SpecializedModule1())
            .registerModule(new SpecializedModule2());
    }

    @Override
    public ObjectMapper getContext(Class type) {
        if(SomeType.isAssignableFrom(type)) {
            return mObjectMapper;
        }
        return null;
    }
}

我在JacksonJsonProvider代码中看到Jackson支持ObjectMapper提供者注入/解析.然而,在实践中,我所看到的是提供者的"顺序"似乎是随机的(我猜它不是,但我不能理清如何控制顺序).有时"覆盖"出现在"默认"之前,一切正常,但在下次服务器启动时,订单会发生变化.

我试图通过多种方式实现这一目标,包括:

ContextResolver手动注册实现(以不同的顺序)

ContextResolver通过@Provider注释注册实现

注册时指定优先级

我使用以下内容:

泽西岛2.8

杰克逊2.3.3

也许我采取了一种完全不正确的方法?
有没有更好的方法来实现我想要做的事情?也许我应该只定义两个独立的JAX-RS应用程序,并为每个应用程序配置一个ObjectMapper?

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有