我的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响应的结果
由于
答案 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