使用Hutool工具类中的BeanUtil.fillBeanWithMap方法报错`DateException`

使用Hutool工具类中的BeanUtil.fillBeanWithMap方法报错DateException

  • 问题背景

    在实现登录功能时,我先将用户信息存入Redis中,然后再获取用户信息的时候,又取出来。我存入Redis的用户信息是Hash格式的,所以取出来的时候,需要通过Map转Bean的方式进行转换,但是在转换的过程中发生了报错:org.springframework.web.util.NestedServletException: Request processing failed; nested exception is cn.hutool.core.date.DateException: Parse ["Sat Jun 10 20:26:54 CST 2023"] with format [EEE MMM dd HH:mm:ss zzz yyyy] error!

    image-20230729165806560

    在这里插入图片描述

  • 问题原因

    原因很简单,BeanUtil.fillBeanWithMap底层对于时间类型的格式转换,默认是采用yyyy-MM-dd HH:mm:ss,而我存入Redis的时间格式直接采用了EEE MMM d HH:mm:ss zzz yyyy

    image-20230729170345797

    这就导致在执行BeanUtil.fillBeanWithMap这行代码时,Hutool底层对日期类型的数据进行格式化,导致格式化失败,从而抛出DateException异常

  • 问题解决

    通过上面的原因分析,我们可以得出这个问题就是日期格式化的问题,既然原因我们知道了,那么解决起来就会很简单了

    • 方案一:从数据写入角度,我们可以在写入Redis的时候,对所有的日期类型的数据进行一个格式化,将EEE MMM d HH:mm:ss zzz yyyy格式化yyyy-MM-dd HH:mm:ss类型,这样在将Map转Bean就不报DateException错误了

      具体实现措施:

      1. 在Redis的配置类中配置一个全局的日期格式化类,所有写入Redis的Date数据在序列化的时候都会格式化为yyyy-MM-dd HH:mm:ss类型(相关具体步骤可以参考文末给出的链接)

      2. 在Bean转Map的时候,手动编码格式化日期(我所使用的,能够成功解决)。上面那种措施我试了,发现不行,因为我是先将Bean转成Map<Object,Object>,这样在序列化的时候,无法识别到当前数据类型是Date,因为都变成了Object,所以在直接在Bean转Map的时候手动格式化,具体代码如下:

            /*** 将Bean转成Map<String, Object>** @param object 目标Bean* @param <T>* @return*/public static <T> Map<String, Object> beanToMap(T object) {return BeanUtil.beanToMap(object, new HashMap<>(),CopyOptions.create().setIgnoreNullValue(true).setFieldValueEditor((fieldName, fieldValue) ->Optional.ofNullable(fieldValue).map(value -> {if (value instanceof Date) {// 如果是Date类型,就格式化为 yyyy-MM-dd HH:mm:ssreturn DateUtil.formatDateTime((Date) value);}return value.toString();}).orElse(null)));}
        

        如果你存入Redis的数据类型是String不是Hash就可以尝试使用措施一

    • 方案二:从数据读取角度,我们通过从Redis中读取数据,然后直接使用BeanUtil.fillBeanWithMap将读取到的Map转成Bean,问题核心是fillBeanWithMap不支持格式化EEE MMM d HH:mm:ss zzz yyyy,既然你不支持,那我就自己写一个工具类,用于将Map转成Bean,同时支持EEE MMM d HH:mm:ss zzz yyyy格式的日期。

      这种方式理论上肯定是可行的,我也让GPT写了个工具类,并成功测试成功了,但是结果不太理想

我采用方案一的措施2,成功解决,

image-20230729175237812

image-20230729175316252

参考文章

  • Redis序列化存储及日期格式的问题处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/14105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ansible的脚本 --- playbook 剧本

文章目录 一、playbook剧本的组成创建剧本运行playbook二、定义、引用变量三、指定远程主机sudo切换用户四、when条件判断五、迭代Templates 模块tags 模块 一、playbook剧本的组成 playbooks 本身由以下各部分组成 &#xff08;1&#xff09;Tasks&#xff1a;任务&#xff0…

kubernetes 证书更新

参考&#xff1a; https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/https://kubernetes.io/zh-cn/docs/tasks/tls/certificate-rotation/ 查看证书 查看 kubelet是否支持证书自动轮换&#xff0c;默认轮换的证书位于目录 /var/lib/kubele…

vscode 打开文件时如何在资源管理器中展开文件所在的整个目录树(包含node_modules)

如题。去 首选项 --> 设置 中 搜索 “Auto Reveal”&#xff0c;然后选true&#xff0c;注意把下面的Auto Reveal Exclude排除项中的node_modules去掉&#xff0c;这样才能定位到node_modules中的文件。 **/node_modules

Leetcode刷题---C语言实现初阶数据结构---单链表

1 删除链表中等于给定值 val 的所有节点 删除链表中等于给定值 val 的所有节点 给你一个链表的头节点head和一个整数val&#xff0c;请你删除链表中所有满足Node.valval的节点&#xff0c;并返回新的头节点 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[…

基于 ThinkPHP 5.1(稳定版本) 开发wms 进销存系统源码

基于ThinkPHP 5.1&#xff08;LTS版本&#xff09;开发的WMS进销存系统源码 管理员账号密码&#xff1a;admin 一、项目简介 这个系统是一个基于ThinkPHP框架的WMS进销存系统。 二、实现功能 控制台 – 权限管理&#xff08;用户管理、角色管理、节点管理&#xff09; – 订…

Docker 入门终极指南[详细]

前言 富 Web 时代&#xff0c;应用变得越来越强大&#xff0c;与此同时也越来越复杂。集群部署、隔离环境、灰度发布以及动态扩容缺一不可&#xff0c;而容器化则成为中间的必要桥梁。 本节我们就来探索一下 Docker 的神秘世界&#xff0c;从零到一掌握 Docker 的基本原理与实…

忽略nan值,沿指定轴计算标准(偏)差numpy.nanstd()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 沿指定轴方向 计算标准(偏)差 numpy.nanstd() [太阳]选择题 import numpy as np a np.array([[1,2],[np.nan,3]]) print("【显示】a ") print(a) print("【执行】np.std(a)&qu…

链表OJ题目1 (移除链表元素)

力扣&#xff08;链接放这里喽&#xff09; 先贴代码再做讲解&#xff1a; struct ListNode* removeElements(struct ListNode* head, int val) {struct ListNode* cur head;struct ListNode* tail NULL;while(cur){if(cur->val val){if(cur head){head head->next…

chatGPT 学习分享:内含PPT分享下载

InstructGPT论文地址&#xff1a; Training language models to follow instructions with human feedbackchatGPT地址&#xff1a;openAI个人整理的PPT&#xff08;可编辑&#xff09;&#xff0c;下载地址&#xff1a;chatGPT学习分享PPT

java排序算法之插入排序

文章目录 &#x1f4cb;插入排序概念&#x1f4d6;实现步骤&#x1f516;代码示例 &#x1f4c8;总结 &#x1f4cb;插入排序概念 插入排序&#xff08;Insertion Sort&#xff09;是一种简单直观的排序算法。它将数组划分为已排序和未排序两个部分&#xff0c;每次从未排序部分…

Linux 多线程并发Socket服务端的实现( 11 ) -【Linux通信架构系列 】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everythi…

25.9 matlab里面的10中优化方法介绍—— 惩罚函数法求约束最优化问题(matlab程序)

1.简述 一、算法原理 1、问题引入 之前我们了解过的算法大部分都是无约束优化问题&#xff0c;其算法有&#xff1a;黄金分割法&#xff0c;牛顿法&#xff0c;拟牛顿法&#xff0c;共轭梯度法&#xff0c;单纯性法等。但在实际工程问题中&#xff0c;大多数优化问题都属于有约…

SpringBoot读取配置文件顺序

文章目录 一、前言二、SpringBoot配置文件目录读取顺序源码解析 三、SpringBoot配置文件类型读取顺序源码解析 一、前言 本文通过源码分析 SpringBoot 加载配置文件目录的顺序&#xff0c;以及 properties、xml、yml、yaml文件的读取顺序 二、SpringBoot配置文件目录读取顺序…

【MySQL】库的操作

废话不多说&#xff0c;直接上操作&#xff1a; 目录 一、查看数据库 二、创建数据库 2.1 数据库的字符集及校验规则 2.1.1 查看系统默认字符集 2.1.2 查看系统默认校验规则 2.1.3 查看数据库支持的字符集 2.1.4 查看数据库支持的校验规则 2.2 创建数据库时设置字符集和…

【二叉树进阶】搜索二叉树(递归+非递归两种版本详解)

文章目录 前言1. 二叉搜索树的概念2. 二叉搜索树的结构2.1 结点结构2.2 树结构 3. 插入操作&#xff08;非递归&#xff09;3.1 思路分析3.2 代码实现3.3 中序遍历&#xff08;测试用&#xff09; 4. 查找操作&#xff08;非递归&#xff09;4.1 思路分析4.2 代码实现 5. 删除操…

【设计模式】观察者设计模式解析

目录 一、观察者模式定义 二、观察者模式角色 三、观察者模式类图 四、观察者模式实例 五、观察者模式优缺点 5.1、优点 5.2、缺点 六、观察者模式应用 6.1、Spring 中观察者模式的四个角色 6.2、coding~~~~~~ 一、观察者模式定义 观察者模式(Observer Pattern)&#…

【如何训练一个中英翻译模型】LSTM机器翻译模型训练与保存(二)

系列文章 【如何训练一个中英翻译模型】LSTM机器翻译seq2seq字符编码&#xff08;一&#xff09; 【如何训练一个中英翻译模型】LSTM机器翻译模型训练与保存&#xff08;二&#xff09; 【如何训练一个中英翻译模型】LSTM机器翻译模型部署&#xff08;三&#xff09; 【如何训…

【框架篇】Spring Boot 日志

Spring Boot 日志 一&#xff0c;日志用途 尽管一个项目在没有日志记录的情况下可能能够正常运行&#xff0c;但是日志记录对于我们来说却是至关重要的&#xff0c;它存在以下功能&#xff1a; 1&#xff0c;故障排查和调试&#xff1a;当项目出现异常或者故障时&#xff0c;…

idea连接远程服务器上传war包文件

idea连接远程服务器&上传war包 文章目录 idea连接远程服务器&上传war包1. 连接服务器2.上传war包 1. 连接服务器 选择Tools -> Start SSH Session 添加配置 连接成功 2.上传war包 Tools -> Deployment -> Browse Remote Host 点击右侧标签&#xff0c;点击&…

gin框架内容(三)--中间件

gin框架内容&#xff08;三&#xff09;--中间件 Gin框架允许开发者在处理请求的过程中&#xff0c;加入用户自己的函数。这个函数就叫中间件&#xff0c;中间件适合处理一些公共的业务逻辑&#xff0c;比如登录认证、权限校验、数据分页、记录日志、耗时统计等 即比如&#x…