杰克逊在 Spring Boot 中错误地序列化了 ZonedDateTime

新手上路,请多包涵

我有一个带有 Spring Boot 和 Jetty 的简单应用程序。我有一个简单的控制器返回一个对象,它有一个 Java 8 ZonedDateTime

 public class Device {
  // ...
  private ZonedDateTime lastUpdated;

  public Device(String id, ZonedDateTime lastUpdated, int course, double latitude, double longitude) {
    // ...
    this.lastUpdated = lastUpdated;
    // ...
  }

  public ZonedDateTime getLastUpdated() {
    return lastUpdated;
  }
}

在我的 RestController 我只是有:

 @RequestMapping("/devices/")
public @ResponseBody List<Device> index() {
  List<Device> devices = new ArrayList<>();
  devices.add(new Device("321421521", ZonedDateTime.now(), 0, 39.89011333, 24.438176666));

  return devices;
}

我原以为 ZonedDateTime 会根据 ISO 格式进行格式化,但我却得到了类的整个 JSON 转储,如下所示:

 "lastUpdated":{"offset":{"totalSeconds":7200,"id":"+02:00","rules":{"fixedOffset":true,"transitionRules":[],"transitions":[]}},"zone":{"id":"Europe/Berlin","rules":{"fixedOffset":false,"transitionRules":[{"month":"MARCH","timeDefinition":"UTC","standardOffset":{"totalSeconds":3600,"id":"+01:00","rules":{"fixedOffset":true,"transitionRules":[],"transitions":[]}},"offsetBefore":{"totalSeconds":3600,"id":"+01:00","rules":{"fixedOffset":true,"transitionRules":[],"transitions":[]}},"offsetAfter":{"totalSeconds":7200,"id":"+02:00", ...

我只有一个 spring-boot-starter-web 应用程序,使用 spring-boot-starter-jetty 并排除 spring-boot-starter-tomcat

为什么杰克逊在 Spring Boot 中表现如此?

\*\* 更新 **

对于那些正在寻找如何解决这个问题的完整分步指南的人,我在提出问题后发现了这一点:http: //lewandowski.io/2016/02/formatting-java-time-with-spring-boot-using-json/

原文由 jbx 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 634
2 个回答

有一个库 jackson-datatype-jsr310 。试试看。

该库涵盖了新的日期时间 API,还包括 ZonedDateTime 的序列化程序。

您只需要添加 JavaTimeModule

 ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());

更新

要将日期时间转换为 ISO-8601 字符串,您应该禁用 WRITE_DATES_AS_TIMESTAMPS 功能。您可以通过覆盖 ObjectMapper bean 或使用 应用程序属性 轻松地做到这一点:

 spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false

原文由 vsminkov 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您不依赖 SpringBoot 的自动配置功能 - 您没有在配置文件中提供 spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false 属性 - 或者出于任何原因手动创建 ObjectMapper 实例。您可以通过编程方式禁用此功能,如下所示:

 ObjectMapper m = new ObjectMapper();
m.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

这是给杰克逊的 2.8.7

原文由 bpawlowski 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题