使用Jackson ObjectMapper在java.time.Instant和java.util.Date之间进行转



我正在尝试使用Jackson的ObjectMapper来映射两个类(例如SrcMessage和DestMessage)。

我的SrcMessage类看起来像:

class SrcMessage {
public Instant workTime;
}

我的DestMessage类看起来像:

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字段并手动处理它们。我宁愿让杰克逊内部处理。

任何想法?

对于转换日期,我建议使用类型的优点,而不是使用Jackson ObjectMapper。使用Date from(Instant instant)静态方法将java.time.Instant类型转换为java.util.Date类型

您可以按照示例所示进行操作:

import java.time.Instant;
import java.util.Date;
public class StackOverflowAnswer {
public static void main(String[] args) {
SrcMessage srcMessage = new SrcMessage(Instant.now());
DestMessage destMessage = DestMessage.fromSrcMessage(srcMessage);
}
}
class SrcMessage {
public Instant workTime;
public SrcMessage(Instant workTime) {
this.workTime = workTime;
}
}
class DestMessage {
public Date workTime;
DestMessage(Date workTime) {
this.workTime = workTime;
}
static DestMessage fromSrcMessage(SrcMessage srcMessage) {
return new DestMessage(Date.from(srcMessage.workTime));
}
}

最新更新