使用Jackson ObjectMapper在java之间进行转换。时间Instant和java。util。日期
我试图使用Jackson的ObjectMapper在两个类(例如SrcMessage和DestMessage)之间进行映射
我的SrcMessage类类似于:
class SrcMessage {
public Instant workTime;
}
我的消息类如下所示:
class DestMessage {
public Date workTime;
}
我正在使用ObjectMapper,如下所示:
SrcMessage src = new SrcMessage ();
src.workTime = Instant.now ();
ObjectMapper mapper = new ObjectMapper ( );
mapper.registerModule (new JavaTimeModule ());
DestMessage dest = mapper.convertValue (src, DestMessage.class);
当我进行convertValue调用时,我收到一条异常消息:
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.Date` out of VALUE_NUMBER_FLOAT token
at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: DestMessage["workTime"])
at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)
at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1468)
at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1242)
at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1148)
at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseDate(StdDeserializer.java:517)
at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateBasedDeserializer._parseDate(DateDeserializers.java:200)
at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateDeserializer.deserialize(DateDeserializers.java:290)
at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateDeserializer.deserialize(DateDeserializers.java:273)
at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:138)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:293)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:156)
at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:4231)
我卡住了。我认为JavaTimeModule足以处理这种转换,但显然不行。我还需要其他模块吗?关于如何实现这一目标的其他建议?到目前为止,我找到的唯一解决方案是在进行映射时忽略workTime字段,然后在映射程序完成后转换该值。不用说,这适用于一个简单的情况,但我不想枚举所有的Instant/Date字段并手动处理它们。我宁愿让杰克逊自己处理
有什么想法吗
# 1 楼答案
对于转换日期,我建议使用类型的优点,而不是使用Jackson ObjectMapper。使用
Date from(Instant instant)
静态方法将java.time.Instant
类型转换为java.util.Date
类型您可以按照示例中的说明进行操作: