首页 > 解决方案 > 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中。但是我无法将propertyin反序列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。有谁知道如何解决它?我被困两天了。谢谢你的帮助。

标签: javaspring-bootspring-data

解决方案


推荐阅读