使用杰克逊的 LocalDateTime 解析
Posted
技术标签:
【中文标题】使用杰克逊的 LocalDateTime 解析【英文标题】:LocalDateTime parsing with jackson 【发布时间】:2020-10-16 00:01:51 【问题描述】:我在将 JSON 映射到具有 LocalDateTime
的 DTO 时遇到问题。
我关注了这个帖子: JSON parse error: Can not construct instance of java.time.LocalDate: no String-argument constructor/factory method to deserialize from String value
添加到 build.gradle
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.11.0'
这是我的 DTO 中的变量:
@Data
public class MyDto
private Long teamId;
private Map<String, List<Long>> details;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime dateOccurred;
并添加了这个
public class MyApplication
@Autowired
private ObjectMapper objectMapper;
public static void main(String[] args)
SpringApplication.run(MyApplication.class, args);
@PostConstruct
public void setUp()
objectMapper.registerModule(new JavaTimeModule());
我错过了什么吗?我收到此错误
org.springframework.messaging.converter.MessageConversionException: Could not read JSON: Cannot construct instance of `java.time.LocalDateTime` (no Creators, like default construct, exist): no String-argument constructor/factory method to deserialize from String value ('2020-06-16 11:12:46')
谢谢!
【问题讨论】:
在这里查看答案:***.com/a/29959842/3415090 这更多地与弹簧启动有关,但我认为添加提到的额外杰克逊依赖项可能会解决您的问题。 分享LocalDateTime
所属的整个bean。
@GoviS 更新了帖子
@mohammedkhan 我试过了,但还是一样。 :(
@mohammedkhan 嗨,谢谢!现在可以了!我错误地添加了LocalDateDeerializer
而不是LocalDateTimeDeserializer
。非常感谢!
【参考方案1】:
感谢@mohammedkhan 的指导!
在这个答案中: JSON Java 8 LocalDateTime format in Spring Boot
spring-boot中已经有设置了,不用@Autowire
ObjectMapper
为 Json Deserializer 添加这个注解
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime dateOccurred;
谢谢!
【讨论】:
serialization 属性对您正在执行的 反序列化 没有帮助。同样LocalDateTimeDeserializer
已经负责反序列化LocalDateTime
,假设您正确注册了JavaTimeModule
(您可以在其构造函数实现中看到)。这里不需要它(除非你的代码中有一些东西你没有向我们展示)。
@SotiriosDelimanolis 嗨,先生。我不确定是否还有别的东西。这些是我所做的唯一更改并且它正在运行。这是我正在检查的答案的链接。 blog.chris-ritchie.com/2014/09/…
如果您有任何其他见解,请告诉我 :)
那篇 2014 年的博文展示了如果您不注册 JavaTimeModule
会做什么。根据您问题中的代码,您是,所以不需要。
@SotiriosDelimanolis ***.com/questions/51527794/… 我已经尝试了另一个。这两种方法,但它仍然不起作用:(以上是关于使用杰克逊的 LocalDateTime 解析的主要内容,如果未能解决你的问题,请参考以下文章