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

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. 使用注解 @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;
4. 我的完整解决截图

实体类
实体类
启动类
在这里插入图片描述
设置格式化方式和序列化方式后redis中的值

在这里插入图片描述

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

  • 20
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值