Spring Data Elasti c - Java .Time.Instant класса Дезерсон Джерсон не работает - PullRequest
0 голосов
/ 17 февраля 2020

Вот мой WorkroomDTO:

  @NotNull
  private Instant createdOn;

  @JsonInclude(JsonInclude.Include.NON_NULL)
  private Instant changedOn;

Как видите, я использую Java 8 Мгновенный класс. На сервере индексаasticsearch я сохраняю следующее как JSON:

  "createdOn": {
    "nano": 877000000,
    "epochSecond": 1579861613
  },
  "changedOn": {
    "nano": 920000000,
    "epochSecond": 1579861613
  },

Проблема заключается в том, что, когда я запрашиваю сервер эластичного поиска, чтобы получить мне рабочую комнату

    return elasticsearchOperations.queryForPage(new NativeSearchQueryBuilder().withQuery(mainQuery)
                                                                          .withPageable(elasticUtils.interceptPageable(searchDto.getPageable(), "name"))
                                                                          .build(),
                                            WorkroomDTO.class);

, я делаю Сопоставление этих полей с моим WorkroomDTO я получаю следующее исключение:

    com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.time.Instant` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
 at [Source: (String)"{"createdOn":{"nano":68000000,"epochSecond":1580127683}

К вашему сведению:

Я создал файл конфигурации, в котором явно регистрируется JavaTimeModule для Object Mapper

 @Configuration
public class JacksonConfiguration {

  @Value("${application.serialization.include-type-key:true}")
  private boolean includeTypeKey = true;

  @Bean
  public ObjectMapper objectMapper() {
    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(new JavaTimeModule());
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    mapper.addHandler(new MissingTypeIdHandler());
    if (includeTypeKey) {
      mapper.setMixInResolver(new TypeKeyMixInResolver());
    }
    return mapper;
  }

}

Нужна помощь!

Ответы [ 2 ]

0 голосов
/ 18 февраля 2020

Откуда эти данные? Это написано вашим приложением?

Похоже, что используемый картограф Джексона не имеет зарегистрированного модуля jackson-datatype-jsr310.

При чтении данных пытается найти конструктор Instant, который можно использовать для создания Instant объект. Но Instant не имеет конструктора по умолчанию, и Mapper должен использовать метод Instant.ofEpochSecond(long, long). Эта страница довольно объявляет о проблеме и показывает, как настроен картограф Джексона.

Хранение мгновенного объекта таким образом, как объекта с двумя свойствами, не является правильным способом хранения дат в Elasticsearch. Вы должны прочитать документацию Elasticsearch о том, как Elastcisearch обрабатывает поля даты / времени. При сохранении момента в виде такого объекта вы теряете возможность использовать запросы Elasticsearch с критериями, основанными на дате / времени.

Какую версию Spring Data Elasticsearch вы используете? Из-за подобных проблем, начиная с следующей версии 4.0, Spring Data Elasticsearch больше не будет использовать маппер Джексона для отображения сущностей. MappingElasticsearchConverter поддерживает использование формата даты Elasticsearch и классов java.time.

0 голосов
/ 17 февраля 2020

Ну, если я не совсем ошибаюсь, ваше сопоставление не выполняется из-за неправильного формата. json, которое вы получите, выглядит следующим образом:

 "createdOn": {
    "nano": 877000000,
    "epochSecond": 1579861613
  },
  "changedOn": {
    "nano": 920000000,
    "epochSecond": 1579861613
  },

Это означает, что у вас есть 2 объекта «createOn» и «ChangeOn» с двумя свойствами (nano, epochSecond), в то время как вы пытаетесь сопоставить его с одним объектом содержит два свойства с именами «madeOn» и «ChangeOn». Вам необходимо изменить это, например, у вас есть класс с именем Entry с двумя свойствами (nano, epochSeconds), а затем класс с двумя свойствами (madeOn, updatedOn) типа Entry

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...