Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JAX-RS(Jersey)和Jackson没有正确序列化LocalDate_Java_Spring Boot_Jackson_Jersey 2.0_Jersey Client - Fatal编程技术网

Java JAX-RS(Jersey)和Jackson没有正确序列化LocalDate

Java 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

我们最近升级到了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”)
中注释
出生日期
在我的情况下,升级后,有效的方法是:

  • 删除
    com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider
    dependency
  • 添加
    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("");

在我的情况下,升级后,有效的方法是:

  • 删除
    com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider
    dependency
  • 添加
    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
(我使用的)是一种方法。它只是在升级后停止工作…不知道那里发生了什么。