Не удалось получить Instant из TemporalAccessor: {}, ISO разрешен до 2018-01-01 типа java.time.format.Parsed

#java #spring-boot #elasticsearch #spring-data-elasticsearch #elasticsearch-dsl

#ява #пружинный ботинок #эластичный поиск #spring-data-эластичный поиск #эластичный поиск-dsl #java #весенняя загрузка #elasticsearch #spring-data-elasticsearch #elasticsearch-dsl

Вопрос:

Я создал документ Elasticsearch (версия 7.8.1) со следующими сопоставлениями:

 {
    "transaction": {
        "mappings": {
            "properties": {
                "_class": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                
                },
                "settlementEntries": {
                    "type": "nested",
                    "properties": {
                        "settlementDate": {
                            "type" : "date",
                            "format" : "uuuu-MM-dd"
                        },
                        "settlementId": {
                            "type": "long"
                        }
                    }
                },
                "transactionId": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                }
            }
        }
    }
}
  

Я использую формат гггг-ММ-дд для хранения расчетной даты. Когда я запрашиваю с помощью curl, я могу видеть данные с помощью CURL -X GET localhost:9200/transaction/_search . Но, когда я пытаюсь сделать то же самое через springboot, он выдает ошибку.Мои объекты:

 public class TransactionBo {

    @Id
    private String transactionId;
    @Field(type = FieldType.Nested)
    private SettlementEntryBo settlementEntries;
    
}
  

и

 public class SettlementEntryBo {

    @Id
    private Long settlementId;
    @Nullable
    @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "uuuu-MM-dd")
private Date settlementDate;

}
  

Из того, что я могу понять, проблема заключается в отображении здесь:

 @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "uuuu-MM-dd")
private Date settlementDate;
  

[ФРАГМЕНТ ОШИБКИ]:

2020-09-05 02:51:18.105 ОШИБКА 10080 — [nio-8090-exec-4] o.a.c.c.C..[.[.[/].[ DispatcherServlet] : Servlet.service() для сервлета [DispatcherServlet] в контексте с path [] вызвал исключение [Ошибка обработки запроса; вложенное исключение — java.time.Исключение DateTimeException: Не удается получить Instant из TemporalAccessor: {}, ISO разрешен до 2016-01-01 типа java.time.format.Parsed] с основной причиной

java.время.темпоральный.Исключение UnsupportedTemporalTypeException: Неподдерживаемое поле: Мгновенные секунды

Комментарии:

1. Будет ли работать использовать LocalDate вместо Date ? Date В любом случае, A не представляет дату.

Ответ №1:

Измените свой шаблон, чтобы использовать uuuu вместо гггг; это задокументировано здесь, изменение в Elasticsearch отвечает за это: https://www.elastic.co/guide/en/elasticsearch/reference/current/migrate-to-java-time.html#java-time-migration-incompatible-date-formats

Еще одна вещь, которую я вижу:

Вы используете формат даты, который содержит только год, месяц и день. Это обычная дата. Но java.util.Date это не дата, а момент времени в зоне UTC, включая временную метку.

Поэтому вам следует изменить тип своего свойства java.time.LocalDate , как предложил Оле в своем комментарии. Эти классы были введены еще в Java 8, чтобы устранить все недостатки, которые есть java.util.Date .

Комментарии:

1. Привет, я внес изменения, но все еще получаю ту же ошибку. Я обновил отображение и журнал ошибок

2. Я добавил больше информации и предложение по изменению