Redis使用用fastjson序列化的两个坑 autoType is not suppor异常和类型转换异常
第一个坑 autoType is not suppor异常
从报错信息上看到,是阿里巴巴的fastjson报的错。
我debug了一下,发现redis读取出的数据全是 jsonObject对象,而不是我想要的Objec对象,肯定转换错误了。
我已经配置好了redis序列化,难道还让我用 jsonObject对象 再 转换一次?
这不能忍 🙌
我又听了隔壁大神的意见。
隔壁大神说:
fastjson为了安全打开AutoType功能 在1.2.25之后的版本,以及所有的.sec01后缀版本中,autotype功能是受限的。
所以我们需要自己开放AutoType功能的白名单;
解决有三种方式
添加白名单有三种方式,三选一,如下:
- 在代码中配置,配置fastjson时直接加上。
ParserConfig.getGlobalInstance().addAccept("com.zry.simpleblog2.");
如果有多个包名前缀,分多次addAccept
- 加上JVM启动参数
-Dfastjson.parser.autoTypeAccept=com.taobao.pac.client.sdk.dataobject.,com.cainiao.
如果有多个包名前缀,用逗号隔开
- 通过fastjson.properties文件配置。
在1.2.25/1.2.26版本支持通过类路径的fastjson.properties文件来配置,配置方式如下:
fastjson.parser.autoTypeAccept=com.taobao.pac.client.sdk.dataobject.,com.cainiao.
如果有多个包名前缀,用逗号隔开
我直接使用第一种方法。完美解决。
第二个坑 类型转换异常
我springboot开发时 ctrl+F9 经常使用,热加载功能很方便。但是这一天在使用Springboot 配合 Redis做缓存处理的时出现了问题
我一使用热加载 ,就报出类型转换异常,最可笑的是同一类型转换出了错?
下面是报错信息:
网上又是一顿搜:
大概意思说是spring-boot devtools工具的问题,由于devtools导致服务重启,然后重启后ClassLoad和原来的ClassLoader不是同一个对象了,所以导致对象的Class也不一样,虽然看上去都是User,但是它就是不同的类型,因为它的Class也不相等。
我也在官网上发现了这个:
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using.devtools.livereload
这应该是给出了解决思路。
解决方案:
我直接不是用热加载,完全解决(不是)。