我配置了 jackson 以便它给我一个简单的字符串表示 ifjava.time.LocalDate和java.time.LocalDateTime。这可以在序列化过程中找到,例如当我在 REST api 上获取数据时。
不过反过来也行不通。当我尝试将数据发送到服务器并且 JSON 应该被解析为 java 对象时,会抛出此异常:
javax.ws.rs.client.ResponseProcessingException: com.fasterxml.jackson.databind.JsonMappingException: 无法构造 java.time.LocalDateTime 的实例: 没有从字符串值反序列化的字符串参数构造函数/工厂方法 ('2018-04- 19T14:10:30.903')
经过几个小时的研究,我设法让它工作,但仅限于我分别用@JsonDeserialize(using = LocalDateDeserializer.class)或注释的属性@JsonDeserialize(using = LocalDateTimeDeserializer.class)。
在我看来,如果我可以在一个中心位置定义这些映射,那将是理想的。
ObjectMapper 配置:
@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {
@Override
public ObjectMapper getContext(Class<?> aClass) {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
return mapper;
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试向 JavaTimeModule 添加自定义反序列化器,但没有成功:
JavaTimeModule dateTimeModule = new JavaTimeModule();
dateTimeModule.addDeserializer(LocalDate.class, LocalDateDeserializer.INSTANCE);
dateTimeModule.addDeserializer(LocalDateTime.class, LocalDateTimeDeserializer.INSTANCE);
mapper.registerModule(dateTimeModule);
Run Code Online (Sandbox Code Playgroud)
长话短说:有没有办法全局定义映射,这样我就不需要在每个字段上添加这些注释。谢谢!
编辑:
好的:我用邮递员测试了它,没有注释,它按预期工作。但是,当我运行单元测试 (JerseyTest) 时,它会抛出上述异常。我将 …