Как проиндексировать документ, содержащий поле ZonedDateTime, вasticsearch - PullRequest
0 голосов
/ 03 мая 2019

Я пытаюсь сохранить документ с zonedDateTime, поданным в es, но получаю ошибку разбора: org.elasticsearch.index.mapper.MapperParsingException: не удалось проанализировать поле [creationDate] типа [date]

Вот мое определение документа

@Document(indexName = "index", type = "myType")
public class myDocument {
  @Id
  private String id;
  private String text;
  @Field(type = FieldType.Date)
  private ZonedDateTime creationDate;
....

Я получаю эту ошибку:

org.elasticsearch.index.mapper.MapperParsingException: failed to parse field [creationDate] of type [date]
    at org.elasticsearch.index.mapper.FieldMapper.parse(FieldMapper.java:301) ~[elasticsearch-6.4.3.jar:6.4.3]
    at org.elasticsearch.index.mapper.DocumentParser.parseObjectOrField(DocumentParser.java:482) ~[elasticsearch-6.4.3.jar:6.4.3]
    at org.elasticsearch.index.mapper.DocumentParser.parseObject(DocumentParser.java:499) ~[elasticsearch-6.4.3.jar:6.4.3]
...
Caused by: java.lang.IllegalStateException: Can't get text on a START_OBJECT at 1:509
    at org.elasticsearch.common.xcontent.json.JsonXContentParser.text(JsonXContentParser.java:86) ~[elasticsearch-x-content-6.4.3.jar:6.4.3]
    at org.elasticsearch.common.xcontent.support.AbstractXContentParser.textOrNull(AbstractXContentParser.java:269) ~[elasticsearch-x-content-6.4.3.jar:6.4.3]
    at org.elasticsearch.index.mapper.DateFieldMapper.parseCreateField(DateFieldMapper.java:444) ~[elasticsearch-6.4.3.jar:6.4.3]
    at org.elasticsearch.index.mapper.FieldMapper.parse(FieldMapper.java:295) ~[elasticsearch-6.4.3.jar:6.4.3]

Я не могу понять, почему я получаю это сообщение об ошибке.

1 Ответ

0 голосов
/ 03 мая 2019

Я выясняю, как это сделать: JavaTimeModule по умолчанию не используется ObjectMapper, нам нужно его зарегистрировать.

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);
     }
  }

Наконец, добавьте его в ElasticsearchTemplate:

new ElasticsearchTemplate(client, new CustomEntityMapper());
...