美文网首页
Redis增加字段,获取数据反序列化失败

Redis增加字段,获取数据反序列化失败

作者: 咖啡机an | 来源:发表于2023-12-07 14:54 被阅读0次

    背景

    1.有2个项目a,b,使用了同一个redis服务中的对象数据,key-value

    "test":{"a":null,"b":null}
    

    2.项目a,新增了一个字段c,并编辑了redis中的数据

    "test":{"a":null,"b":null,"c":null}
    

    3.项目a可以正常运行,但是项目b获取test的val时,反序列化失败

    org.springframework.data.redis.serializer.SerializationException: 
    Could not read JSON: 
    Unrecognized field "c" (class com.ty.test),
    not marked as ignorable (2 known properties: "a", "b"])
    

    原因

    反序列化的时候没有找到对应的set方法

     /**
         * Helper method called for an unknown property, when using "vanilla"
         * processing.
         *
         * @param beanOrBuilder Either POJO instance (if constructed), or builder
         *   (in case of builder-based approach), that has property we haven't been
         *   able to handle yet.
         */
        protected void handleUnknownVanilla(JsonParser p, DeserializationContext ctxt,
                Object beanOrBuilder, String propName)
            throws IOException
        {
            if (_ignorableProps != null && _ignorableProps.contains(propName)) {
                handleIgnoredProperty(p, ctxt, beanOrBuilder, propName);
            } else if (_anySetter != null) {
                try {
                   // should we consider return type of any setter?
                    _anySetter.deserializeAndSet(p, ctxt, beanOrBuilder, propName);
                } catch (Exception e) {
                    wrapAndThrow(e, beanOrBuilder, propName, ctxt);
                }
            } else {
                // Unknown: let's call handler method
                handleUnknownProperty(p, ctxt, beanOrBuilder, propName);         
            }
        }
    
        /**
         * Method called when a JSON property is encountered that has not matching
         * setter, any-setter or field, and thus cannot be assigned.
         */
        @Override
        protected void handleUnknownProperty(JsonParser p, DeserializationContext ctxt,
                Object beanOrClass, String propName)
            throws IOException
        {
            if (_ignoreAllUnknown) {
                p.skipChildren();
                return;
            }
            if (_ignorableProps != null && _ignorableProps.contains(propName)) {
                handleIgnoredProperty(p, ctxt, beanOrClass, propName);
            }
            // Otherwise use default handling (call handler(s); if not
            // handled, throw exception or skip depending on settings)
            super.handleUnknownProperty(p, ctxt, beanOrClass, propName);
        }
    

    解决方法

    在每个redis的实体类上新增注解

    //添加注解,忽略不存在的key
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class Test
    

    相关文章

      网友评论

          本文标题:Redis增加字段,获取数据反序列化失败

          本文链接:https://www.haomeiwen.com/subject/eeisgdtx.html