0

我有一个侦听主题的队列,我的侦听器收到 DTO。我需要将字符串解析为,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));
    }
}

谢谢您的帮助!任何建议都会很棒。

4

2 回答 2

1

使用格式模式字符串来定义格式。

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 格式。那么您将不需要显式格式化程序。one-argLocalDateTime.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

于 2020-06-17T15:44:25.500 回答
0

我刚刚了解到这也是解析的一个选项:)

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "uuuu-MM-dd HH:mm:ss")
private LocalDateTime dateOccurred;
于 2020-06-22T09:38:50.240 回答