java - redisTemplate 无法正确反序列化具有 Object 属性的 Object
问题描述
情况如下:<code>TargetObj 是redis中要设置的值。
public class TargetObj implements Serializable {
private int id;
private String name;
private Father property;
public int getId() {..}
public void setId(int id) {..}
public String getName() {..}
public void setName(String name) {..}
public Father getProperty() {..}
public void setProperty(Father property) {..}
类Father
:
public class Father implements Serializable {
private String fatherName;
public String getFatherName() {..}
public void setFatherName(String fatherName) {..}
类Son
:
public class Son extends Father implements Serializable {
String sonName;
public String getSonName() {..}
public void setSonName(String sonName) {..}
然后,我尝试TargetObj
通过 redisTemplate 在 redis 中存储一个实例,如下所示:
TargetObj to = new TargetObj();
to.setId(1);
to.setName("toname");
Son son = new Son();
son.setFatherName("fatherName");
son.setSonName("sonName");
to.setProperty(son);//the Property type is Father, and I set a son to it
redisTemplate.opsForValue().set("test", to);
ObjectMapper om = new ObjectMapper();
Object test = om.convertValue(redisTemplate.opsForValue().get("test"), TargetObj.class);
但我收到一个错误:
java.lang.IllegalArgumentException: Unrecognized field "sonName" (class com.hyc.backend.dao.Father), not marked as ignorable (one known property: "fatherName"])
at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: com.hyc.backend.dao.TargetObj["property"]->com.hyc.backend.dao.Father["sonName"])
综上所述,我给Son
实例中命名property
的字段设置了一个类型实例TargetObj
,该字段的静态类型为Father
. 然后我将TargetObj
实例存储在redis中。但是我无法将property
in反序列TargetObj
化为Son
类型,将其反序列化为 aFatherType
并抛出异常。
RedisConfig
:
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
@Bean(name = "redisTemplate")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
jackson2JsonRedisSerializer.setObjectMapper(om);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
我的springboot版本是2.4.3。有谁知道如何解决它?我被困两天了。谢谢你的帮助。
解决方案
推荐阅读
- python - 通过映射双索引 groupby 对象填充数据框中的 NA 值
- swift - 防止ipad关闭键盘扩展上的虚拟键盘
- lua - 无效参数 #3(预期实例,得到字符串)
- html - 以 100% 的动画显示 CSS
- android - Android studio webview显示bug
- javascript - 如果变量路径返回未定义,如何将值返回给变量?
- java - java - 如何在Java中以空格分隔用户输入
- javascript - 用 async/await 重构一个 fetch 请求,并且有些清晰
- android - 如何创建可重用的 Android BottomSheet 演示文稿
- c++ - 尝试在 Visual Studio 2019 中编译 c++ 项目时出现错误“/ZI”和“/Gy-”命令行选项不兼容如何解决?