排个雷,坑了我两个小时

写了一个JVM详细信息的监控面板
因为读取速度太慢想做个缓存
因为数据太多直接用了@Cacheable注解

如下:

@Cacheable(cacheNames = DevConstants.MONITOR_SERVER,key = "#root.methodName")

完美运行,读取速度快了一倍
然后当我写Redis监控面板时发现一个问题
SpringCache可以正常读取和写入这个方法的返回对象
我自己去用redisTemplate.opsForValue().get(key)却读取不了
一直报错

com.alibaba.fastjson.JSONException: default constructor not found. class java.lang.management.LockIn

这我一看,序列化器出了问题啊,我自己写的redis序列化器用的fastjson,这我熟啊
但是一搜人傻了,并且得到以下结论
fastjson转对象需要构造函数,所以
1.需要转的实体私有化了构造函数

2.需要转的实体没写构造函数
但是我有个习惯是,不管干啥的所有实体类上都加上这些注解

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor

所以非常的莫名其妙,我明明有了@NoArgsConstructor还能是啥原因
然后又试了一下其他的用了SpringCache的方法,都能用redisTemplate.opsForValue().get(key)正常读取,无一例外,唯独这个JVM监控
突然。。。我再仔细看了下报错
class java.lang.management.LockIn
找不到这个,我心想没用过这个呀,LockIn是啥玩意儿,然后用在类上导了一下这个包😅
提示我是java.lang.management.LockInfo
我甘霖娘!!!
网上搜了下LockInfo属于java标准库的,我不能控制或修改他,序列化也不行。。。
真的,这个实体四十几个参数,当时偷懒了这一个,就这一个我是直接这么写的
private LockInfo lock;
真是给自己挖个坑,自己还跳进去了😅

话说回来为啥SpringCache能反序列化java库的LockInfo呢?
因为SpringCache没用fastjson,人家用的jackson

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值