【问题标题】:Jackson - LocalDateTime format杰克逊 - LocalDateTime 格式
【发布时间】:2019-12-25 11:13:12
【问题描述】:

我知道同一主题有几个问题,但我认为它们不能完全涵盖我在 Spring Boot 2 应用程序中的问题。

我有一个使用 LocalTimeDate 的模型。通过 rest api 得到这个工作正常,日期格式为 "date":"2019-12-17T08:50:00"

我创建了序列化器,以便自定义 json 输出,因为存在我不想扩展的引用字段。

自定义序列化器中的相关代码是

jgen.writeStringField("date", formatter.format(value.date));

使用格式化程序作为

private SimpleDateFormat formatter  = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");

我使用自定义序列化程序类将@JsonSerialize 应用于模型类。结果是

{"timestamp":"2019-12-25T10:57:50.482+0000","status":500,"error":"内部 服务器错误","消息":"无法写入 JSON:无法格式化给定 对象作为日期;嵌套异常是 com.fasterxml.jackson.databind.JsonMappingException:无法格式化 给定对象作为日期(通过引用链: java.util.ArrayList[0])","路径":"/api/v1/climates"}

我以https://codeboje.de/jackson-java-8-datetime-handling/ 为指导,因此更新了 pom 和 application.properties,然后让 Spring 发挥它的魔力。

有什么我遗漏的吗?

【问题讨论】:

  • SimpleDateFormat 是一个过时的类,用于解析和格式化过时的 java.util.Date 类。阅读 LocalDateTime javadoc 以了解如何格式化 LocalDateTime。但只需使用 toString() 即可为您提供标准的 ISO 格式。
  • 我严重怀疑您是否需要任何自定义序列化程序。我通过使用jackson-modules-java8 并将WRITE_DATES_AS_TIMESTAMPS 设置为false 解决了类似的问题。 (我同意你在任何情况下都应该远离SimpleDateFormat。)
  • 另外,请注意您的“2019-12-25T10:57:50.482+0000”包含您的格式无法处理的时区信息,LocalDateTime 也与时区无关。这可能是个问题。此外,像其他人一样,我非常同意 - 不要触摸 SimpleDateFormat。参见 java.time.format.DateTimeFormatter 类

标签: java-8 jackson datetime-format iso8601


【解决方案1】:

您需要使用java.time.format.DateTimeFormatter。在你的情况下:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");

你可以像废弃的SimpleDateFormat类一样使用它。

【讨论】:

    【解决方案2】:

    所以最终我还是选择了

    jgen.writeStringField("date", value.getDate().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
    

    哪个有效。

    【讨论】:

      猜你喜欢
      • 2019-05-18
      • 1970-01-01
      • 2020-10-16
      • 2017-06-04
      • 2015-05-02
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      相关资源
      最近更新 更多