【发布时间】: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