错误日志:
org.springframework.data.redis.serializer.SerializationException: Could not read JSON: Unrecognized field "name" (class com.xx.xx.Xx), not marked as ignorable (14 known
properties)
分析:
- 根据错误提⽰可以⼤概知道,Redis在反序列化的时候失败,没有找到对应的属性可以进⾏反序列化,并且给出了解决提⽰name 没有标记忽略
- 写了⼀个序列化测试类,发现jackson 序列化会对 getter ⽅法进⾏序列化,序列化的key 为 getter⽅法的名字 ,如 getName 则key为 name , value 为 ⽅法的返回值。但是直接通过 Jackson的 readValue⽅法反序列化时,并没有报以上错误,反序列化正常。通过断点调试发现⼀般对 bean 进⾏反序列化会使⽤类提供的⽅法,⽽看错误栈的最底层会发现 报错的反序列化类 是BeanSerializer 。
原因:
在类中原来有个name ,废弃后删除name,但是Redis中存在缓存,废弃后的代码获取缓存时导致反序列化失败。
解决方案:
- 解决⽅法⼀ :在类上添加 注解@JsonIgnoreProperties(ignoreUnknown = true)
- 解决⽅法⼆ :除属性的getter ⽅法外,其他⽅法不要以get开通