是否有任何用于解决 java.time.Instant 反序列化错误的注释。我收到此错误,因为我的 dateType 字段为 Instant

Are there any annotations for resolving java.time.Instant deserialization errors. I am getting this error as I have a dateType field as Instant

提问人:mnfsd 提问时间:2/28/2023 最后编辑:Codermnfsd 更新时间:3/13/2023 访问量:144

问:

错误:Java 8 日期/时间类型** ** 默认不支持:添加模块“com.fasterxml.jackson.datatype:jackson-datatype-jsr310java.time.Instant

我已经关注了论坛评论并添加了相关的依赖项和映射器,但无法解决问题。

请告诉我是否有任何注释可以解决问题,例如我们对java.time.LocalDate的@JsonDeserialize(using = LocalDateDeserializer.class)

添加了 Jackson 库的依赖项,如本论坛中建议的那样

对于即时字段,我的输入将是这样的:2022-01-21T18:38:55Z

@Bean 
ObjectMapper objectMapper() { 
  ObjectMapper objectMapper = new ObjectMapper(); 
  objectMapper.registerModule(new JavaTimeModule()); 
  return objectMapper; 
}
反序列化 jackson-databind java.time.instant

评论

1赞 Mark Rotteveel 2/28/2023
请提供一个最小的可重复示例。具体来说,类路径上有哪些库、如何初始化对象映射器、使用的代码以及确切的异常堆栈跟踪。
0赞 mnfsd 2/28/2023
添加了以下映射器: @Bean ObjectMapper objectMapper() { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.registerModule(new JavaTimeModule()); return objectMapper; } 并添加了以下功能: jackson-datatype-jdk8(2.11.3), jackson-datatype-jsr310(2.11.3)
1赞 Basil Bourque 2/28/2023
将详细信息作为对问题的编辑发布,而不是作为评论发布。
0赞 Coder 2/28/2023
这回答了你的问题吗?使用 Jackson JSON 映射器序列化/反序列化 Java 8 java.time

答:

0赞 Coder 2/28/2023 #1

在用于创建对象映射器 Bean 的代码中添加此内容

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.findAndRegisterModules();

更多细节在这篇文章

0赞 mnfsd 3/3/2023 #2

我通过添加 DefaultInstantSerializer 和 DefaultInstantDeserializer 类并使用各自的 Serializer 和 Deserializer 类进行包装解决了这个问题。下面的代码将帮助您解决此问题,并使用这些默认类注释 java.time.Instant 变量。

1.

public class DefaultInstantSerializer extends InstantSerializer { 
    public DefaultInstantSerializer() {
        super(InstantSerializer.INSTANCE, false, false, 
            new DateTimeFormatterBuilder().appendInstant(3).toFormatter());
    }
}
public class DefaultInstantDeserializer extends InstantDeserializer<Instant> {
    public DefaultInstantDeserializer() {
        super(Instant.class, DateTimeFormatter.ISO_INSTANT,
            Instant::from,
            a -> Instant.ofEpochMilli(a.value), 
            a -> Instant.ofEpochSecond(a.integer, a.fraction),
            null,true);
    }
}

用法:

public class SomeModel {
   // Other fields

   JsonDeserialize(using= DefaultInstantDeserializer.class)
   JsonSerialize(using = DefaultInstantSerializer.class)
   private Instant instant;
}