Java JAX-RS(Jersey)和Jackson没有正确序列化LocalDate
我们最近升级到了Spring BootJava JAX-RS(Jersey)和Jackson没有正确序列化LocalDate,java,spring-boot,jackson,jersey-2.0,jersey-client,Java,Spring Boot,Jackson,Jersey 2.0,Jersey Client,我们最近升级到了Spring Boot2.0,有了它,JAX-RS在2.1和Jackson在2.26 现在的问题是,我试图(序列化并)通过POST发送的Java对象有一个Java.time.LocalDate类型的字段,并且它没有被正确序列化(转换为JSON)。这是更新后的结果: ... "birthDate": { "year": 1991, "month": "JANUARY", "chronology": { "id": "ISO", "calendarType
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”)
中注释出生日期
在我的情况下,升级后,有效的方法是:
- 删除
dependencycom.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider
- 添加
依赖项org.glassfish.jersey.media:jersey-media-json-jackson
- 修复所有编译问题
:troll\u 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("");
在我的情况下,升级后,有效的方法是:
- 删除
dependencycom.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider
- 添加
依赖项org.glassfish.jersey.media:jersey-media-json-jackson
- 修复所有编译问题
:troll\u 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("");
Jackson有一个模块可以在序列化中启用JSR310。是的,对于Java8(及以后版本)的日期/时间类型,
JavaTimeModule
(我使用的)是一种方法。它只是在升级后停止工作…不确定那里发生了什么。Jackson有一个模块可以在序列化中启用JSR310。是的,对于Java8(及以后版本)的日期/时间类型,JavaTimeModule
(我使用的)是一种方法。它只是在升级后停止工作…不知道那里发生了什么。