使用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

正则,JS:this,同步异步,原型链笔记整理

一 正则表达式 正则表达式&#xff08;regular expression&#xff09;是一种表达文本模式&#xff08;即字符串结构&#xff09;的方法&#xff0c;有点像字符串的模板&#xff0c;常常用来按照“给定模式”匹配文本 正则表达式可以用于以下常见操作&#xff1a; 匹配&…

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 的基本原理与实…

【Golang】Golang进阶系列教程--Go 语言 new 和 make 关键字的区别

文章目录 前言new源码使用 make源码使用 总结 前言 本篇文章来介绍一道非常常见的面试题&#xff0c;到底有多常见呢&#xff1f;可能很多面试的开场白就是由此开始的。那就是 new 和 make 这两个内置函数的区别。 在 Go 语言中&#xff0c;有两个比较雷同的内置函数&#xf…

忽略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…

微信小程序:生成二维码带参数并获取值

通过后台接口可以获取小程序任意页面的小程序码&#xff0c;需要注意的是接口只能生成已发布的小程序的二维码 小程序接口文档 获取 scene 值 1&#xff09;scene 字段的值会作为 query 参数传递给小程序/小游戏。用户扫描该码进入小程序/小游戏后&#xff0c;开发者可以获取…

链表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…

「问题」如何解决 MyBatis 中的 if 标签无法识别参数为 0 的问题

如何解决 MyBatis 中的 if 标签无法识别参数为 0 的问题 如何让参数为0也能进入if标签的方法中&#xff1f;1、问题2、原因3、怎么解决这个问题&#xff1f; 如何让参数为0也能进入if标签的方法中&#xff1f; 1、问题 mybatis中的自己写的判断方法&#xff0c;若参数buildin…

react map使用方法详解

在React中&#xff0c;map()方法是用于数组的常见方法之一&#xff0c;它可以用于处理数组并返回一个新的数组。在React中&#xff0c;经常使用map()方法来遍历数组&#xff0c;生成对应的组件列表或进行数据转换操作。 下面是map()方法在React中的使用方法详解&#xff1a; …

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

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

阿里巴巴 arthas的MathGame源码是什么

阿里巴巴开源的arthas是一个非常优秀的在线调试工具&#xff0c;为了方便学习者练习&#xff0c;提供了一个demo程序MathGame&#xff0c;并且发布在github中&#xff0c;不过呢&#xff0c;国内有时打不开&#xff0c;此时我们可以使用源码直接在我们的idea中启动&#xff0c;…

JUC并发编程之等待唤醒机制

目录 1. 线程等待唤醒机制 1.1 使用Object的wait()和notify()方法 1.2 使用Condition接口 1.3 使用LockSupport类 1. 线程等待唤醒机制 在JUC&#xff08;Java Util Concurrent&#xff09;并发编程中&#xff0c;线程等待唤醒机制是实现线程之间协作和同步的重要手段。这…

AIGC(Artificial Intelligence and Graph Computing)职业发展路径和前景如何?

目录 一、AIGC 基本概念二、AIGC 市场规模三、AIGC 未来发展前景四、AIGC 职业发展路径五、AIGC 技能要求六、AIGC 相关公司 AIGC&#xff08;Artificial Intelligence and Graph Computing&#xff09;是人工智能和图计算的结合&#xff0c;它是一种用于处理大规模复杂数据的计…

暑假刷题第16天--7/28

143. 最大异或对 - AcWing题库&#xff08;字典树&#xff09; #include<iostream> using namespace std; const int N100005; int a[N]; int nex[10000007][2],cnt; void insert(int x){int p0;for(int i30;i>0;i--){int ux>>i&1;if(!nex[p][u])nex[p][u]…

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…