Я использую репозиторий Spring-Data Elasticsearch для хранения данных и извлечения данных из Elasticsearch с помощью высокоуровневого остального клиента. Сохраняемое поле имеет тип ZonedDateTime, и, хотя оно успешно сохраняет значение, возникает ошибка при сопоставлении его с классом данных.
Эта ошибка выдается, когда я пытаюсь получить документ по id:
org.springframework.data.elasticsearch.ElasticsearchException: failed to map source [ {"time":"2020-04-20T14:01:38.470305Z"}] to class TimeTest] with root cause
Поле в классе данных timeTest (содержит поле) и расширяемый класс Test (содержит идентификатор):
@Document(indexName = "test")
public class TimeTest extends Test{
@Field(type = FieldType.Date)
private ZonedDateTime time;
\\getters and setters
}
@Document(indexName = "test")
public abstract class Test {
@Id
private String id;
\\getters and setters
}
customEntityConfiguration, чтобы Джексон распознал Java API даты и времени
@Bean
ElasticsearchRestTemplate elasticsearchTemplate(ObjectMapper objectMapper) {
return new ElasticsearchRestTemplate(client(), new CustomEntityMapper(objectMapper));
}
public class CustomEntityMapper implements EntityMapper {
private final ObjectMapper objectMapper;
public CustomEntityMapper(ObjectMapper objectMapper) {
this.objectMapper = 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(final Object object) throws IOException {
return objectMapper.writeValueAsString(object);
}
@Override
public <T> T mapToObject(final String source, final Class<T> clazz) throws IOException {
return objectMapper.readValue(source, clazz);
}
@Override
public Map<String, Object> mapObject(Object source) {
// TODO Auto-generated method stub
return null;
}
@Override
public <T> T readObject(Map<String, Object> source, Class<T> targetType) {
// TODO Auto-generated method stub
return null;
}
}
Методы сохранения (что работает) и извлечения по идентификатору (какие ошибки):
@Override
public void store(ZonedDateTime time) {
repository.save(time);
}
@Override
public TimeTest getResult(String id) {
return repository.findById(id);
}
Поле хранится правильно, как видно из Json ответ от curl localhost: 9200 / test / _doc / 12345? pretty
{
"_index" : "test",
"_type" : "_doc",
"_id" : "12345",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 2,
"found" : true,
"_source" : {
"time" : "2020-04-20T14:01:38.470305Z"
}
}