java8 Websphere Liberty 中的时间反序列化

java8 time deserialization in Websphere Liberty

我的 Websphere Liberty installation/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 响应

的结果

谢谢

Liberty JAX-RS 2.0 功能包括 Jackson 以执行 Java 类 到 JSON 的基本序列化,但它不公开任何 Jackson API。

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

然后你还可以包含 Jackson JSR310 module 来让你的 Java 8 次序列化,如你所愿。

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

您想调用 JacksonJsonProvider.setMapper() 但这不是直截了当的,因为通常此对象会由 Liberty 自动实例化,而您永远看不到它。

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

改编您 link 中的示例,您可以这样写:

@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;
    }
}

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


更新: 如果您在 Application class 中覆盖 getClasses(),则 JacksonJsonProviderJSR310MapperProvider 不会被自动发现。您需要将这两个 class 都包含在 return 来自 getClasses()

的集合中