Как десериализовать OffsetDateTime в Spring Data Elasticsearch? - PullRequest
1 голос
/ 02 марта 2020

Я не могу десериализовать OffsetDateTime в весна, когда я просто получаю документ из кластера. Существует несколько подходов к решению проблемы, но в основном они применимы к предыдущим версиям загрузки Spring. Кроме того, в текущем выпуске моментального снимка Spring-Data -asticSearch маппер Джексона удален и заменен некоторым классом маппера. c 6.x / 7.x?

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.time.OffsetDateTime` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

Я использую клиент высокого уровня REST.

Решение: Решено с помощью специального сопоставления сущностей:

public class CustomEntityMapper implements EntityMapper {

    private final ObjectMapper objectMapper;

    public CustomEntityMapper() {

            JavaTimeModule javaTimeModule = new JavaTimeModule();
            javaTimeModule.addDeserializer(LocalDateTime.class, new MillisOrLocalDateTimeDeserializer());

            objectMapper = new ObjectMapper()
                                      .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
                                      .enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
                                     .enable(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS)
                                      .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
                                      .registerModule(javaTimeModule)
            ;

            objectMapper.setVisibility(objectMapper.getSerializationConfig().getDefaultVisibilityChecker()
                            .withFieldVisibility(JsonAutoDetect.Visibility.ANY)
                            .withGetterVisibility(JsonAutoDetect.Visibility.NONE)
                            .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
                            .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));

            objectMapper.findAndRegisterModules();
    }

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

    @Override
    public Map<String, Object> mapObject(Object source) {
        return null;
    }

    @Override
    public <T> T readObject(Map<String, Object> source, Class<T> targetType) {
        return null;
    }
}

1 Ответ

0 голосов
/ 02 марта 2020

Для Spring Data Elasticsearch 3.2 вам нужно будет использовать настроенную программу Jackson Mapper, в которой вы регистрируете соответствующие модули.

Начиная с версии Spring Data Elasticsearch 4.0 (в настоящее время доступна в виде промежуточного выпуска 4.0.0.M3) OffsetDateTime можно писать и читать в произвольном формате даты, кажется, что OffsetDateTime требователен при разборе, я бы подумал, что формат basic_date_time должен работать, но мне нужно было найти строку нестандартного формата.

Я только что попробовал следующее определение:

@Field(type=FieldType.Date, format=DateFormat.custom, pattern="uuuu-MM-dd'T'HH:mm:ss.SSSSSSSSSZ")

Но, как уже говорилось, это будет для следующей версии Spring Data Elasticsearch.

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