我决定将我的日期对象转移到前端,作为纪元以来的长几毫秒。我已经编写了一个Serializer来将LocalDate对象转换为自epoch以来的Long miliseconds和一个解串器,以便将从json获取的long值转换回LocalDate。
在客户端,我从这个值创建一个JS Date Object,并将Date对象转换回自epoch以来的毫秒,当我想将对象发送回服务器时。
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();
}
}
@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模块中,并尝试尽可能少地进行更改。
如果您可能需要更多信息,请随时发表评论!