Elasticsearch извлекает ZonedDateTime - не удалось сопоставить источник [{}] с классом - PullRequest
0 голосов
/ 20 апреля 2020

Я использую репозиторий 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"
  }
}
...