Json LocalDate反序列化器未被调用

时间:2017-04-03 08:47:21

标签: java json serialization jackson

未调用LocalDateDeserializer。

我决定将我的日期对象转移到前端,作为纪元以来的长几毫秒。我已经编写了一个Serializer来将LocalDate对象转换为自epoch以来的Long miliseconds和一个解串器,以便将从json获取的long值转换回LocalDate。

在客户端,我从这个值创建一个JS Date Object,并将Date对象转换回自epoch以来的毫秒,当我想将对象发送回服务器时。

Serializer和Deserializer

public class LocalDateSerializer extends JsonSerializer<LocalDate> {
@Override
public void serialize(LocalDate localDate, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
    /*
        Converting LocalDate to milliSeconds since epoch to easily transfer date objects.
     */
    jsonGenerator.writeString(Long.toString((localDate.atStartOfDay(ZoneId.systemDefault()).toEpochSecond())*1000));
}

}

public class LocalDateDeserializer extends JsonDeserializer<LocalDate> {
@Override
public LocalDate deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
    //Parsing json to LocalDate.
    Long sinceEpoch = Long.parseLong(jsonParser.getValueAsString());
    return Instant.ofEpochMilli(sinceEpoch).atZone(ZoneId.systemDefault()).toLocalDate();
}

}

ObjectMapper配置

@Bean
@Primary
public ObjectMapper jsonObjectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    JSR310Module dateModule = new JSR310Module();
    dateModule.addSerializer(LocalDate.class, new LocalDateSerializer());
    dateModule.addDeserializer(LocalDate.class, new LocalDateDeserializer());
    SimpleModule valueTypeModule = new SimpleModule();
    valueTypeModule.addDeserializer(AbstractValueType.class, new ValueTypeDeserializer());
    objectMapper.registerModule(dateModule);
    objectMapper.registerModule(valueTypeModule);
    return objectMapper;
}

问题

串行器被称为应该的方式,但解串器不是。我收到此错误:

nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class java.time.LocalDate] from String value ('-30610224561000'); no single-String constructor/factory method

其他信息

我没有使用JavaTimeModule,因为我使用旧版本的Jackson来保持与其他依赖项的兼容性。

我试图不使用注释,因为域模型位于一个单独的maven模块中,并尝试尽可能少地进行更改。

如果您可能需要更多信息,请随时发表评论!

0 个答案:

没有答案