Не удалось прочитать JSON: невозможно построить экземпляр `java .time.ZonedDateTime` (не существует создателей, таких как конструкция по умолчанию) - PullRequest
0 голосов
/ 03 августа 2020

У меня есть служба, которая прослушивает очередь, а затем сопоставляет ее с POJO. Но я всегда получаю эту ошибку, даже после установки @Configuration ObjectMapper

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        mapper.registerModule(new JavaTimeModule());

        return mapper;
    }

My POJO:

public class ResultDto {
    private ZonedDateTime dateSent;

    private ZonedDateTime dateDeliveryReceiptReceived;

    public ResultDto() {}
}

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

Caused by: org.springframework.messaging.converter.MessageConversionException: Could not read JSON: Cannot construct instance of `java.time.ZonedDateTime` (no Creators, like default construct, exist): no String-argument constructor/factory method to deserialize from String value ('2020-08-03T11:02:51.044+0000')

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 04 августа 2020

Судя по ошибке, похоже, что ищет конструктор String -аргумента. Попробуйте добавить в ResultDto следующие конструкторы:

public ResultDto(ZonedDateTime dateSent, ZonedDateTime dateDeliveryReceiptReceived) {
    this.dateSent = dateSent;
    this.dateDeliveryReceiptReceived = dateDeliveryReceiptReceived;
}

public ResultDto(String dateSent, String dateDeliveryReceiptReceived) {
    this.dateSent = ZonedDateTime.parse(dateSent, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"));
    this.dateDeliveryReceiptReceived = ZonedDateTime.parse(dateDeliveryReceiptReceived,
            DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"));
}
1 голос
/ 03 августа 2020

Use @JsonFormat(pattern = 'specify pattern here')

ObjectMapper по умолчанию пытается создать объект ZonedDateTime со строкой в ​​конструкторе, и такой вещи не существует. Добавив эту аннотацию, вы позволите ей анализировать ее из String в заданном формате.

0 голосов
/ 04 августа 2020

Спасибо тем, кто ответил.

С помощью товарища по команде мы обнаружили, что весеннее облако имеет свой собственный объектный картограф. И не напрямую ObjectMapper. Поскольку этот DTO / POJO относится к сообщению от AWS SNS / SQS.

Это должно делать:

@Bean
public MappingJackson2MessageConverter mappingJackson2MessageConverter(ObjectMapper objectMapper) {
    MappingJackson2MessageConverter jacksonMessageConverter = new MappingJackson2MessageConverter();
    jacksonMessageConverter.setObjectMapper(objectMapper);
    jacksonMessageConverter.setSerializedPayloadClass(String.class);
    jacksonMessageConverter.setStrictContentTypeMatch(true);
    return jacksonMessageConverter;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...