Websphere Liberty中的java8时间反序列化

时间:2017-02-24 10:05:41

标签: java-8 ibm-cloud websphere-liberty

我的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响应的结果

由于

1 个答案:

答案 0 :(得分:3)

Liberty JAX-RS 2.0功能包括Jackson将Java类的基本序列化为JSON,但它不会暴露任何Jackson API。

如果你想改变杰克逊的行为,你应该在你的应用程序中捆绑这些库,以便Liberty使用你提供的杰克逊而不是内部的杰克逊:

然后您还可以包含Jackson JSR310 module以使您的Java 8次序列化。

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

你想要调用<Border Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3" VerticalAlignment="Bottom" Margin="10,0,10,0"> <Border.Background> <LinearGradientBrush StartPoint="0,1" EndPoint="1,1"> <GradientStop Color="DarkGray" Offset="0.05"/> <GradientStop Color="Gray" Offset="0.15"/> <GradientStop Color="Gray" Offset="0.85"/> <GradientStop Color="DarkGray" Offset="0.95"/> </LinearGradientBrush> </Border.Background> <TextBlock /> </Border> ,但这不是直截了当的,因为通常这个对象会被Liberty自动实例化,你永远不会看到它。

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

根据您的链接调整示例,您可以编写如下内容:

JacksonJsonProvider.setMapper()

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

更新:如果您在@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; } } 课程中覆盖getClasses(),那么Application和您的JacksonJsonProvider将不会自动发现。您需要在从JSR310MapperProvider

返回的集合中包含这两个类