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("");
我们最近升级到 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("");