JAX-RS(泽西岛)和 Jackson 没有正确序列化 LocalDate

JAX-RS (Jersey) and Jackson does not serialize LocalDate correctly

我们最近升级到 Spring Boot 2.0,因此,JAX-RS 在 2.1 和 Jackson 在 2.26

现在的问题是我试图(序列化和)通过 POST 发送的 Java 对象有一个 java.time.LocalDate 类型的字段并且它没有被序列化(进入JSON) 正确。这是更新后的结果:

...
"birthDate": {
  "year": 1991,
  "month": "JANUARY",
  "chronology": {
    "id": "ISO",
    "calendarType": "iso8601"
  },
  "monthValue": 1,
  "dayOfMonth": 1,
  "dayOfWeek": "TUESDAY",
  "era": "CE",
  "dayOfYear": 1,
  "leapYear": false
},
...

...相反,birthDate 应该像 "birthDate": "1991-01-01" 一样发送——就像以前一样。

客户端配置为:

final ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
final JacksonJsonProvider provider = new JacksonJsonProvider();
provider.setMapper(mapper);
return ClientBuilder.newClient(new ClientConfig(provider))
    .target("http://hostname/api/some-path")
    .path("");

我还尝试注释 @JsonFormat(pattern = "yyyy-MM-dd") 归档的 birthDate

就我而言,升级后有效的是:

  • 删除com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider依赖
  • 添加org.glassfish.jersey.media:jersey-media-json-jackson依赖
  • 修复您遇到的任何编译问题:troll_face:
  • 使用 JacksonJaxbJsonProvider 而不是 JacksonJsonProvider — 这完全出乎我的意料

最后,客户端的最终配置如下所示:

final ObjectMapper mapper = new ObjectMapper()
    .registerModule(new JavaTimeModule())
    .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
return ClientBuilder.newClient() // ClientConfig if needed
    .register(new JacksonJaxbJsonProvider(mapper, JacksonJaxbJsonProvider.DEFAULT_ANNOTATIONS))
    .target("http://hostname/api/some-path")
    .path("");