【问题标题】:Backward compatibility issues when migrating to use Jackson with Jersey迁移以使用 Jackson 和 Jersey 时的向后兼容性问题
【发布时间】:2013-01-23 13:29:32
【问题描述】:

我正在使用 Jersey 1.16 为我的客户端应用程序提供宁静的服务。

我正在尝试从默认的 Jersey JSON 序列化程序转移到使用基于这个优秀博客条目的杰克逊:

http://crazytechbuddy.blogspot.co.il/2012/06/making-jersey-to-use-jackson-instead-of.html?showComment=1360271858862#c6459334450173933715

效果很好,似乎正是我想要的。 但是它现在为我的 restful 服务带来了向后兼容性问题。

例如:我曾经序列化为"timestamp":"2012-12-25T14:22:24+02:00" 的时间戳字段现在序列化为"timestamp":1356438144000

有没有办法选择仅在特定请求上激活新的基于杰克逊的序列化模式(可能使用版本参数,我必须决定使用哪种类型的序列化)?

【问题讨论】:

    标签: json serialization jersey jackson backwards-compatibility


    【解决方案1】:

    Jackson 有很多序列化选项。在您的情况下,您需要设置:

    private ObjectMapper mapper = new ObjectMapper();
    mapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);
    

    如果您使用的是 Jackson 1.x 或

    private ObjectMapper mapper = new ObjectMapper();
    mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    

    如果您使用的是 Jackson 2.x。

    要允许 Jersey 访问您的自定义 ObjectMapper,您需要创建一个提供程序:

    @Provider
    public class ObjectMapperProvider implements ContextResolver<ObjectMapper>
    {
      private final transient ObjectMapper mapper;
    
      @Inject
      public ObjectMapperProvider()
      {
        this.mapper = MyMapper.getMapper();
      }
    
      @Override
      public ObjectMapper getContext(final Class<?> type)
      {
        return this.mapper;
      }
    }
    

    MyMapper.getMapper() 在哪里返回您的自定义 ObjectMapper

    【讨论】:

    • 当我明确使用映射器时,这看起来很合适 - 对吧?但是如果它只是被泽西岛使用呢?
    • 添加了有关如何访问您的客户 ObjectMapper 的信息。
    • 谢谢。我想这应该在球衣的 com.sun.jersey.config.property.packages 初始化参数引用的包中。我没有对此进行测试,因为我已经为我当前的需求设置了一个使用 @JSONSerialize 的解决方案。但它看起来是一个正确而完整的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    相关资源
    最近更新 更多