杰克逊转换 LocalDatetime

cvd*_*vdr 5 java jackson spring-boot

我有一个带有 @JsonFormat 的 LocalDateTime 字段

@JsonFormat(pattern = "yyyy-MM-dd'T'hh:mm:ss.SSS'Z'")
private LocalDateTime dateTime;
Run Code Online (Sandbox Code Playgroud)

当 Jackson 尝试解析像2018-11-28T15:24:00.000Z这样的日期时,会抛出异常

com.fasterxml.jackson.databind.JsonMappingException:无法构造 java.time.LocalDateTime 的实例:没有字符串参数构造函数/工厂方法来从字符串值反序列化('2018-11-28T15:24:00.000Z')

在我的 pom.xml 中我有:

  • 春季启动1.5.7
  • 杰克逊数据类型-jdk8
  • 杰克逊数据类型-jsr310

我的 ObjectMapper Bean:

@Bean
public ObjectMapper postConstruct() {
    return this.builder
           .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
            .defaultUseWrapper(false)
            .build();
}
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

@JsonFormat(pattern = "yyyy-MM-dd'T'hh:mm:ss.SSS'Z'", timezone ="UTC")
private LocalDateTime dateTime;
Run Code Online (Sandbox Code Playgroud)

Sur*_*aut 8

我也遇到过类似的问题。出现此问题的原因是映射器无法从 String 对象创建 LocalDateTime 实例。下面就解决你的问题。

@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonFormat(pattern = "yyyy-MM-dd'T'hh:mm:ss.SSS'Z'")
private LocalDateTime dateTime;
Run Code Online (Sandbox Code Playgroud)

如果您不想明确提及 Serializer/Deseralizer,则必须按照 Jackson 发布 DateTime Java 8 增强功能的指南执行以下任一操作。

ObjectMapper mapper = new ObjectMapper()
   .registerModule(new ParameterNamesModule())
   .registerModule(new Jdk8Module())
   .registerModule(new JavaTimeModule());
Run Code Online (Sandbox Code Playgroud)

或者

ObjectMapper mapper = new ObjectMapper();
mapper.findAndRegisterModules();
Run Code Online (Sandbox Code Playgroud)

在 SpringBoot 中,ObjectMapper 实例是 AutoWired,因此我不知道我们是否可以明确执行任一解决方案。因此,就目前而言,明确提及序列化器/反序列化器的脏解决方案是我最好的选择。

JackSon Java8 LocalDateTime 增强 ReadMe 页面如下

https://github.com/FasterXML/jackson-modules-java8/blob/master/README.md