irpas技术客

Redis使用fastjson序列化的两个坑 类型转换异常_菜鸟猫喵喵_redis使用fastjson序列化

网络 6385

第一个坑 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 这应该是给出了解决思路。

解决方案:

我直接不是用热加载,完全解决(不是)。

所以嗦:好不要再用fastjson了,bug不断。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #第一个坑 #autotype #is #not