Websphere Liberty 中的 java8 时间反序列化

alt*_*3de 3 java-8 websphere-liberty ibm-cloud

我的 Websphere Liberty 安装/IBM Bluemix 实例遇到问题。我正在使用新的 java.time 类(例如 LocalDateTime),但使用 Jackson 2.8 映射器的反序列化版本会导致难以处理的结果(完整对象反序列化而不是时间戳)。 https://geowarin.github.io/jsr310-dates-with-jackson.html 但是我怎样才能在 Liberty 中做同样的事情呢?例如:接收 2016-02-02T23:24:08.255+01:00 作为反序列化 JSON 响应的结果

谢谢

Azq*_*elt 5

Liberty JAX-RS 2.0 功能部件包括 Jackson,用于将 Java 类基本序列化为 JSON,但它不公开任何 Jackson API。

如果您想更改 Jackson 的行为,您应该将这些库捆绑到您的应用程序中,以便 Liberty 使用您提供的 Jackson,而不是它内部的 Jackson:

然后,您还可以包含Jackson JSR310 模块,以便根据需要对 Java 8 进行序列化。

但是,根据该页面上的文档,您需要向对象映射器注册该模块。

您想要调用JacksonJsonProvider.setMapper(),但这并不简单,因为通常该对象会由 Liberty 自动实例化,而您永远看不到它。

相反,您可以创建一个 ContextProvider 来告诉 Jackson JAX-RS 提供者在 Liberty 实例化它时要使用什么 ObjectMapper。

改编您链接中的示例,您可以编写如下内容:

@Provider
public class JSR310MapperProvider implements ContextResolver<ObjectMapper> {

    @Override
    public ObjectMapper getContext(Class<?> type) {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JavaTimeModule());
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        return mapper;
    }
}
Run Code Online (Sandbox Code Playgroud)

这应该创建一个配置好的映射器,然后 Jackson 应该使用它来序列化您的 Java 8 时间对象。


更新:getClasses()如果您在班级中覆盖Application,则不会自动发现JacksonJsonProvider和 your 。JSR310MapperProvider您需要将这两个类包含在您返回的集合中getClasses()