网站建设 排名,个人开发app需要多少钱,河北公司网站建设效果,集团网站建设服务使用Hutool工具类中的BeanUtil.fillBeanWithMap方法报错DateException 问题背景 在实现登录功能时#xff0c;我先将用户信息存入Redis中#xff0c;然后再获取用户信息的时候#xff0c;又取出来。我存入Redis的用户信息是Hash格式的#xff0c;所以取出来的时候#xff…使用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! 问题原因 原因很简单BeanUtil.fillBeanWithMap底层对于时间类型的格式转换默认是采用yyyy-MM-dd HH:mm:ss而我存入Redis的时间格式直接采用了EEE MMM d HH:mm:ss zzz yyyy 这就导致在执行BeanUtil.fillBeanWithMap这行代码时Hutool底层对日期类型的数据进行格式化导致格式化失败从而抛出DateException异常 问题解决 通过上面的原因分析我们可以得出这个问题就是日期格式化的问题既然原因我们知道了那么解决起来就会很简单了 方案一从数据写入角度我们可以在写入Redis的时候对所有的日期类型的数据进行一个格式化将EEE MMM d HH:mm:ss zzz yyyy格式化yyyy-MM-dd HH:mm:ss类型这样在将Map转Bean就不报DateException错误了 具体实现措施 在Redis的配置类中配置一个全局的日期格式化类所有写入Redis的Date数据在序列化的时候都会格式化为yyyy-MM-dd HH:mm:ss类型相关具体步骤可以参考文末给出的链接 在Bean转Map的时候手动编码格式化日期我所使用的能够成功解决。上面那种措施我试了发现不行因为我是先将Bean转成MapObject,Object这样在序列化的时候无法识别到当前数据类型是Date因为都变成了Object所以在直接在Bean转Map的时候手动格式化具体代码如下 /*** 将Bean转成MapString, Object** param object 目标Bean* param T* return*/public static T MapString, 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成功解决 参考文章 Redis序列化存储及日期格式的问题处理