Could not read JSON: Unrecognized field "valid"

问题描述:
配置RedisTemplatesetValueSerializerJackson2JsonRedisSerializer 类型总是报下面的错误, 应该是存储的时候, 自动多加了额外的字段,导致解析的时候没法还原session 对象。 如果使用JdkSerializationRedisSerializer序列化方式就可以。
这个问题应该怎么处理呢?

Could not read JSON: Unrecognized field "valid" (class org.apache.shiro.session.mgt.SimpleSession), not marked as ignorable (9 known properties: "attributeKeys", "timeout", "startTimestamp", "expired", "lastAccessTime", "host", "id", "stopTimestamp", "attributes"]) at [Source: (byte[])"{"@class":"org.apache.shiro.session.mgt.SimpleSession","id":"47079159-610a-4eb9-95f4-73e4b366521b","startTimestamp":["java.util.Date",1554862402286],"stopTimestamp":null,"lastAccessTime":["java.util.Date",1554862402286],"timeout":1800000,"expired":false,"host":"0:0:0:0:0:0:0:1","attributes":null,"valid":true,"attributeKeys":["java.util.Collections$EmptySet",[]]}"; line: 1, column: 310] (through reference chain: org.apache.shiro.session.mgt.SimpleSession["valid"]); nested exception is com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "valid" (class org.apache.shiro.session.mgt.SimpleSession), not marked as ignorable (9 known properties: "attributeKeys", "timeout", "startTimestamp", "expired", "lastAccessTime", "host", "id", "stopTimestamp", "attributes"]) at [Source: (byte[])"{"@class":"org.apache.shiro.session.mgt.SimpleSession","id":"47079159-610a-4eb9-95f4-73e4b366521b","startTimestamp":["java.util.Date",1554862402286],"stopTimestamp":null,"lastAccessTime":["java.util.Date",1554862402286],"timeout":1800000,"expired":false,"host":"0:0:0:0:0:0:0:1","attributes":null,"valid":true,"attributeKeys":["java.util.Collections$EmptySet",[]]}"; line: 1, column: 310] (through reference chain: org.apache.shiro.session.mgt.SimpleSession["valid"])

配置类:

@Configuration
public class RedisConfiguration {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        System.out.println(getClass() + " config redis...");

        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);

        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        template.setKeySerializer(stringRedisSerializer);
        template.setHashKeySerializer(stringRedisSerializer);


        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);

        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.setHashValueSerializer(jackson2JsonRedisSerializer);

        //template.setValueSerializer(new JdkSerializationRedisSerializer());
        //template.setHashValueSerializer(new JdkSerializationRedisSerializer());


        template.afterPropertiesSet();
        return template;
    }
阅读 14.8k
2 个回答
新手上路,请多包涵

参考:
https://stackoverflow.com/que...

 ObjectMapper om = new ObjectMapper();
 om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
 om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
 ...

希望对你有帮助

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题