【BUG解决】Cannot construct instance of java.time.LocalDate....Could not read JSON: Expected array..._cannot construct instance of `java.time.localdatet

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中想信息也没有删除。如下

登录时的redis数据如图

2. 原因

存入redis中时应该时间格式应该是 1998-07-012021-01-30 03:00:51这样的时间格式,但是默认存的却是默认格式的。问题的原因是LocalDateTime、LocalDate、LocalTime没有格式化成yyyy-MM-dd HH:mm:ss类似这样的格式。

还有要将LocalDateTime、LocalDate、LocalTime的反序列化方式设置一下、因为它们默认的反序列化方式是 序列化成了一个数组类型

3. 解决方法

直接将时间格式化、还有设置时间的反序列化方式
一、设置时间格式化、可以添加一个Bean、也可以使用@JsonFormat注解

  1. 添加一个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
  1. 使用注解 @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中的值

在这里插入图片描述

参考链接:序列化方式时间格式化方式LocalDate时间的序列化方式