【发布时间】:2019-09-24 05:10:42
【问题描述】:
我正在使用带有 ElasticSearch 的 Spring Boot 2.1.4 和 Spring Data Jest。我最初使用 Java Date 来处理一些带有以下注释的属性:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern ="yyyy-MM-dd'T'HH:mm:ss.SSSZZ")
这样保存到 ElasticSearch 中:
"creationDate": "2019-04-10T14:49:05.672+0000"
现在,我正在从 Date 迁移到 LocalDateTime 和 ZonedDateTime。现在将数据保存到 ElasticSearch 时,我保存了以下属性:
"creationDate": {
"dayOfYear": 123,
"dayOfWeek": "FRIDAY",
"month": "MAY",
"dayOfMonth": 3,
"year": 2019,
"monthValue": 5,
"hour": 11,
"minute": 54,
"second": 12,
"nano": 238000000,
"chronology": {
"id": "ISO",
"calendarType": "iso8601"
}
},
我需要做些什么来更改它,以便获得与以前的 LocalDateTime 和 ZonedDateTime 相同的 ElasticSearch 数据格式?
我尝试了以下方法:
-
自定义对象映射器如下:
public class CustomEntityMapper implements EntityMapper { private final ObjectMapper objectMapper; public CustomEntityMapper(ObjectMapper objectMapper) { this.objectMapper = new ObjectMapper(); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true); objectMapper.registerModule(new CustomGeoModule()); objectMapper.registerModule(new JavaTimeModule()); } @Override public String mapToString(Object object) throws IOException { return objectMapper.writeValueAsString(object); } @Override public <T> T mapToObject(String source, Class<T> clazz) throws IOException { return objectMapper.readValue(source, clazz); } } -
在对象映射器中添加以下内容:
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
任何我出错的帮助或指示将不胜感激。
【问题讨论】:
-
永远不要使用
LocalDateTime来表示片刻,因为该类故意缺少任何时区或UTC偏移量的癌症。使用Instant、OffsetDateTime或ZonedDateTime表示时间轴上的特定点。 -
感谢您的评论,为什么不应该使用 LocalDateTime?我的示例是创建日期的字段。
-
您的 JSON 输入代表一个时刻,即时间线上的一个特定点。
LocalDateTime不能代表片刻。阅读课堂文档。在 Stack Overflow 上阅读有关该主题的许多其他帖子。 -
仅供参考,您所说的“ElasticSearch 数据格式”实际上是标准的ISO 8601 格式,用于以文本方式表示日期时间值。在解析/生成字符串时,这些格式默认在 java.time 类中使用。
-
您的示例 ISO 8601 字符串与您的示例 JSON 不匹配。提供示例数据时,请务必准确。
标签: java spring-boot elasticsearch jackson spring-data