写了一个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