MessageConversionException произошло при сопоставлении даты строки с LocalDateTime - PullRequest
0 голосов
/ 17 июня 2020

У меня есть очередь, которая слушает topi c, а мой слушатель получает DTO. Мне нужно разобрать String на LocalDateTime, но я получаю эту ошибку

org.springframework.messaging.converter.MessageConversionException: Could not read JSON: Text '2020-06-18 11:12:46' could not be parsed at index 10

Вот подробности сообщения

{"id":444, "details":{"TYPE":[1]},"dateOccurred":"2020-06-18 11:12:46"}"] 

И вот как я установил его в моем DTO

public class PlanSubscriptionDto {
    private Long id;

    private Map<String, List<Long>> details;

    private LocalDateTime dateOccurred;

    public void setDateOccurred(String dateTime) {
        this.dateOccurred = LocalDateTime.parse(dateTime, DateTimeFormatter.ISO_DATE_TIME);
//ive also tried this
//this.dateOccurred = LocalDateTime.parse(dateTime, DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG));
    }
}

Спасибо за вашу помощь! Любой совет был бы замечательным.

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Используйте строку шаблона формата для определения формата.

public class PlanSubscriptionDto {
    private static final DateTimeFormatter FORMATTER
            = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");

    private Long id;

    private Map<String, List<Long>> details;

    private LocalDateTime dateOccurred;

    public void setDateOccurred(String dateTime) {
        this.dateOccurred = LocalDateTime.parse(dateTime, FORMATTER);
    }
}

Почему ваш код не работает?

Формат ISO 8601 имеет T между датой и временем . В строке даты и времени нет T, поэтому DateTimeFormatter.ISO_DATE_TIME не может ее проанализировать.

Варианты

Теперь мы находимся, я хотел бы показать пару других параметры. Вкус отличается, поэтому я не могу сказать, какой из них вам больше понравится.

Вы можете указать T, чтобы получить формат ISO 8601. Тогда вам не понадобится явное средство форматирования. Один аргумент LocalDateTime.parse() анализирует формат ISO 8601.

    public void setDateOccurred(String dateTime) {
        dateTime = dateTime.replace(' ', 'T');
        this.dateOccurred = LocalDateTime.parse(dateTime);
    }

Или, придерживаясь средства форматирования и промежутка между датой и временем, мы можем определить средство форматирования более многословным способом:

    private static final DateTimeFormatter FORMATTER = new DateTimeFormatterBuilder()
            .append(DateTimeFormatter.ISO_LOCAL_DATE)
            .appendLiteral(' ')
            .append(DateTimeFormatter.ISO_LOCAL_TIME)
            .toFormatter();

Что мы получаем для дополнительных строк кода, так это (1) большее повторное использование встроенных средств форматирования (2) это средство форматирования будет принимать время без секунд и время с долей секунды, потому что DateTimeFormatter.ISO_LOCAL_TIME принимает.

Ссылка

Статья в Википедии: ISO 8601

0 голосов
/ 22 июня 2020

Я только что узнал, что это тоже вариант для разбора :)

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "uuuu-MM-dd HH:mm:ss")
private LocalDateTime dateOccurred;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...