有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用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) 个答案

  1. # 1 楼答案

    对于转换日期,我建议使用类型的优点,而不是使用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));
        }
    }