Cannot construct instance of java.time.LocalDate no Creators, like default constructor, exist: cannot deserialize from Object value no delegate- or property-based Creator
1. 问题描述
使用LocalDateTime、LocalDate、LocalTime等时间做实体类属性的类型。项目使用的是redis 、springsecurity前后端分离的项目,在登录时将用户信息存入redis中、登录正常存入、但是退出时发现报错 Cannot construct instance of java.time.LocalDate (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
Could not read JSON: Expected array or string.
。导致了项目退出失败、而且redis中想信息也没有删除。如下
2. 原因
存入redis中时应该时间格式应该是 1998-07-01
和 2021-01-30 03:00:51
这样的时间格式,但是默认存的却是默认格式的。问题的原因是LocalDateTime、LocalDate、LocalTime没有格式化成yyyy-MM-dd HH:mm:ss
类似这样的格式。
还有要将LocalDateTime、LocalDate、LocalTime的反序列化方式设置一下、因为它们默认的反序列化方式是 序列化成了一个数组类型
3. 解决方法
直接将时间格式化、还有设置时间的反序列化方式
一、设置时间格式化、可以添加一个Bean、也可以使用@JsonFormat
注解
- 添加一个Bean
@Bean(name = "mapperObject")
public ObjectMapper getObjectMapper() {
ObjectMapper om = new ObjectMapper();
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
om.registerModule(javaTimeModule);
return om;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 使用注解
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
,其中patter设置成对应的时间格式就可
二、在实体类字段上设置反序列化方式。
// 如:
// 设置序列化方式,using里的值要和属性类型一致
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
// 格式化
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
// 如:
// 设置序列化方式
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonSerialize(using = LocalDateSerializer.class)
// 格式化
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
private LocalDate birthday;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
4. 我的完整解决截图
实体类
启动类
设置格式化方式和序列化方式后redis中的值