开发者社区> 问答> 正文

springboot+shiro+redis序列化问题?报错

大致配置文件:

redis:

@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {

    StringRedisTemplate template = new StringRedisTemplate(factory);
    setSerializer(template); //设置序列化工具,这样ReportBean不需要实现Serializable接口
    template.afterPropertiesSet();
    return template;
}

private void setSerializer(StringRedisTemplate template) {

    // 使用Jackson2JsonRedisSerialize 替换默认序列化
    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);
}

shiro:继承

AbstractSessionDAO
/**
 * 读取session
 * @param sessionId
 * @return
 */
@Override
protected Session doReadSession(Serializable sessionId) {
    System.out.println("==============doReadSession=================");
    if (sessionId == null) {
        return null;
    }

    Session session = (Session) redisTemplate.opsForValue().get(sessionId);
    logger.info("读取session++++++++++++:sessionId = "+sessionId+",session:"+session);

    return session;
}

但是读取的时候报错:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "valid" (class org.apache.shiro.session.mgt.SimpleSession), not marked as ignorable (10 known properties: "attributeKeys", "timeout", "startTimestamp", "expired", "lastAccessTime", "host", "id", "stopTimestamp", "attributes", "attributesLazy"])
 

查了下,是反序列化报错,字段啥的,但是也没看出啥问题啊?求解

 

展开
收起
爱吃鱼的程序员 2020-06-06 20:20:32 1736 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB
                        <pre><code>Unrecognized field "valid"</code></pre> 
    

    你调试看看是不是序列化的时候有‘valid’这个字段,反序列化的实体没有这个字段

                                回复 <a class="referer" target="_blank">@Danielly</a>  : 谢谢指点,它确实不是一个字段,是一个isValid的方法,返回bool类型,我目前使用了其他的序列化方式,避过这一环先,非常感谢指导!
                        
    
                                回复 <a class="referer" target="_blank">@樱木花道VS康</a>  : 那有可能valid不是Session对象的一个属性,而是一个方法。Jackson序列化是通过方法来确定字段的,你可以序列化的时候把valid方法忽略,或者反序列化的时候忽略未知字段
                        
    
                            您好,我是使用的shiro里面的session,我是redis存储session,在获取就出了,存储后确实有这个字段,同一个类型从Redis读取就报错这个字段不识别,,,
                        
    
                        <p>解决了没有,我也遇到这个问题了</p>
    

     

                            没有啊,,,我放弃使用jackson2序列化了,不用json显示了,,,回头再研究
    
    
                        
    
                        <p>现在我也遇到这个问题了,有好的解决方案没有</p>
    
    2020-06-06 20:20:49
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Redis在唯品会的应用实践——架构演进与功能定制 立即下载
微博的Redis定制之路 立即下载
云数据库Redis版的开源之路 立即下载