如何使 Spring Data Elasticsearch 与 java.time.LocalDateTime 一起工作以获取日期 [英] How to make Spring Data Elasticsearch work with java.time.LocalDateTime for date
问题描述
我正在对 Elasticsearch 使用 Spring Data 支持.这是时间戳字段映射:
I am using Spring Data support for Elasticsearch. Here is the timestamp field mapping:
@Field(type = FieldType.Date, index = FieldIndex.not_analyzed, store = true,
format = DateFormat.custom, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZZ")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern ="yyyy-MM-dd'T'HH:mm:ss.SSSZZ")
private LocalDateTime timestamp;
这导致 Elasticsearch 中字段的映射如下:
This results in mapping of the field in Elasticsearch as follows:
"timestamp":{"type":"date","store":true,"format":"yyyy-MM-dd'T'HH:mm:ss.SSSZZ"}
当我使用 java.util.Date 时,一切正常.但是,当我切换到上面的 java.time.LocalDateTime 时,发送到 Elasticsearch 的文档会导致异常.这是文档(时间戳字段仅为简洁起见):
When I use java.util.Date instead everything works fine. However, when I switch to java.time.LocalDateTime as above the document sent to Elasticsearch causes an exception. Here is the document (timestamp field only for brevity):
"timestamp": {
"hour":7, "minute":56, "second":9, "nano":147000000, "year":2017, "month":"FEBRUARY",
"dayOfMonth":13, "dayOfWeek":"MONDAY", "dayOfYear":44, "monthValue":2, "chronology": {
"id":"ISO", "calendarType": "iso8601"
}
}
还有例外:
MapperParsingException[failed to parse [timestamp]]; nested: IllegalArgumentException[unknown property [hour]];
(...)
Caused by: java.lang.IllegalArgumentException: unknown property [hour]
在对文档进行 jsonizing 时,这里的模式似乎被忽略了.任何可能的提示?或者您可能知道如何在 Spring Data 中使用内置"_timestamp 字段?
It looks like the pattern is being ignored here when jsonizing the document. Any possible tips? Or perhaps you might know how to use the "built-in" _timestamp field with Spring Data?
推荐答案
检查 https://github.com/spring-projects/spring-data-elasticsearch/wiki/Custom-ObjectMapper 将 JavaTimeModule
添加到您的 ObjectMapper
.
Check https://github.com/spring-projects/spring-data-elasticsearch/wiki/Custom-ObjectMapper to add JavaTimeModule
to your ObjectMapper
.
@Configuration
public class ElasticSearchConfiguration {
@Bean
public ElasticsearchTemplate elasticsearchTemplate(Client client) {
return new ElasticsearchTemplate(client, new CustomEntityMapper());
}
public static class CustomEntityMapper implements EntityMapper {
private final ObjectMapper objectMapper;
public CustomEntityMapper() {
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);
}
}
}
这篇关于如何使 Spring Data Elasticsearch 与 java.time.LocalDateTime 一起工作以获取日期的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!