一、问题描述
项目追加Redis缓存后,报错autotype is not support错误。根据网上资料解决后,报Json解析错误,后查看Redis数据库中该数据格式发现,存入的是枚举名称(即字符串),而接收的是对象类型,故报错
二、查找并解决
1.查看日志,报autoType is not support错误,上百度!--->FastJson解析失败,autotype is not support!这是博主给出的原因。
2017年3月15日,fastjson官方发布安全升级公告,该公告介绍fastjson在1.2.24及之前的版本存在代码执行漏洞,当恶意攻击者提交一个精心构造的序列化数据到服务端时,由于fastjson在反序列化时存在漏洞,可导致远程任意代码执行。
自1.2.25及之后的版本,禁用了部分autotype的功能,也就是”@type”这种指定类型的功能会被限制在一定范围内使用。
而由于反序列化对象时,需要检查是否开启了autotype。所以如果反序列化检查时,autotype没有开启,就会报错
既然找到了原因,安排!
publicclassRedisConfig { RedisConfig(){ //打开autotype功能ParserConfig.getGlobalInstance() //需要开启autotype的全类名 .addAccept("com.entity.dto.UserDTO"); } }
然后接收报错,,不过这次是json格式错误导致解析失败。
百思不得其解,为啥存入时序列化没问题,取出反序列化就报错?
难道是姿势不对?
换个坐姿,还是不行。
咋整?
直接看Redis数据库数据!
果不其然,Java中Metric是个对象,但是数据库中确实字符串!
为何出现这种情况呢?是因为,在给Metric赋值的时候,采取了枚举类,此时序列化会序列化为字符串,而不是对象类型!!!
如何解决?
自定义Metric对象,而不是采用枚举类!
importorg.springframework.data.geo.Metric; /*** @Description : 自定义Metric 类*/publicclassKilometersMetricimplementsMetric { publicKilometersMetric(){ } publicdoublegetMultiplier() { return6378.137D; } publicStringgetAbbreviation() { return"km"; } }
此时再看Redis中数据格式,已经为对象形式,就没有了序列化问题了。
完结,撒花,又是的一天。