#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. Я добавил больше информации и предложение по изменению