当时用springSecurity+redis存储/读取用户信息的时候,发生报错。

报错异常

Class:class org.springframework.data.redis.serializer.SerializationException
LocalizedMessage:Could not read JSON: Problem deserializing 'setterless' property ("authorities"):
no way to handle typed deser with setterless yet at [Source: (byte[])"{"@class":"com.jia.pojo.User"
,"id":1,"username":"root",
"paassword":"{bcrypt}$2a$10$zI7PbpjGfcsxblk50lTlr.kLW65lAAoZU6Ic.a8b1.I6V4XXk/Je.",
"phone":"15061964947","enabled":true,"accountNonExpired":true,"accountNonLocked":true,
"credentialsNonExpired":true,"roles":["java.util.ArrayList",[]],"role":null,
"authorities":["java.util.HashSet",[]]}"; line: 1, column: 314] (through reference chain:
com.jia.pojo.User["authorities"]); nested exception is com.fasterxml.jackson.databind.exc.
InvalidDefinitionException: Problem deserializing 'setterless' property ("authorities"):
no way to handle typed deser with setterless yet at [Source: (byte[])"
{"@class":"com.jia.pojo.User","id":1,"username":"root","password":"{bcrypt}$2a$10$zI7PbpjGfcsxblk
50lTlr.kLW65lAAoZU6Ic.a8b1.I6V4XXk/Je.",
"phone":"15061964947","enabled":true,"accountNonExpired":true,"accountNonLocked":true,
"credentialsNonExpired":true,"roles":["java.util.ArrayList",[]],"role":null,
"authorities":["java.util.HashSet",[]]}"; line: 1, column: 314]
(through reference chain: com.jia.pojo.User["authorities"])

错误原因

这一段异常错误最主要的点在于这:

 Problem deserializing 'setterless' property ("authorities"): no way to handle typed deser with setterless yet at

大概意思就是反序列化属性(“authorities”)的问题:没有setterless 方法处理输入值。

说白了就是在我们设置redis时redisConfig我们采用的是jackson,而Jackson采用的反序列化时会调用属性的set方法注入值。

RedisConfig中自定义RedisTemplate代码:

 public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();template.setConnectionFactory(factory);//序列化配置Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);//om.activateDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);  过期方法,采用下面代替om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance , ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);jackson2JsonRedisSerializer.setObjectMapper(om);//String序列化StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();// key采用String的序列化方式template.setKeySerializer(stringRedisSerializer);// hash的key也采用String的序列化方式template.setHashKeySerializer(stringRedisSerializer);// value序列化方式采用jacksontemplate.setValueSerializer(jackson2JsonRedisSerializer);// hash的value序列化方式采用jacksontemplate.setHashValueSerializer(jackson2JsonRedisSerializer);template.afterPropertiesSet();return template;}

这里是配置写入读取redis值时采用jackson进行操作。

         // value序列化方式采用jacksontemplate.setValueSerializer(jackson2JsonRedisSerializer);

但我们自定义的user类缺只有重写的getAuthorities()方法。没有getAuthorities()方法,因此jackson反序列化的时候就会失败。

好了,知道了原因,解决方法就简单了。

解决方法

1、手动添加authorities属性。添加getAuthorities()方法

 @TableField(exist = false) private Collection<? extends GrantedAuthority> authorities;
   public void setAuthorities(Collection<? extends GrantedAuthority> authorities) {this.authorities = authorities;}

2、在getAuthorities()上添加@JsonIgnore,序列化时忽略此选项。

     @Override@JsonIgnorepublic Collection<? extends GrantedAuthority> getAuthorities() {Set<SimpleGrantedAuthority> authorities=new HashSet<>();roles.forEach(role -> {SimpleGrantedAuthority authority = new SimpleGrantedAuthority(role.getName());authorities.add(authority);});return authorities;}

注意:如果你的前端需要authorities数据这个方法就不可以行。所以我还是建议第一种方法。可以在保证数据完整行的前提下完美解决问题。

搞定

要是解决了你的问题记得帮我点个赞哦!

springSecurity+redis反序列化失败--problem deserializing ‘setterless‘ property (“authorities“)相关推荐

  1. Spring Boot分布式系统实践【扩展1】shiro+redis实现session共享、simplesession反序列化失败的问题定位及反思改进...

    前言 调试之前请先关闭Favicon配置 spring:favicon:enabled: false 不然会发现有2个请求(如果用nginx+ 浏览器调试的话) 序列化工具类[fastjson版本1. ...

  2. SpringBoot整合SpringSecurity+Redis权限控制

    SpringBoot整合SpringSecurity+Redis权限控制 1.认识SpringSecurity 2.效果截图 2.1.登录接口 2.2.注册接口 2.3.管理员权限接口 2.4.普通用 ...

  3. 004-protostuff踩坑-java bean新增字段反序列化失败问题

    protostuff 避免 更改 java 对象字段 ,比如新增一个,导致 redis 等缓存 的数据反序列化失败问题?? 问题重现: 我们有个方法 通过 attrKey 查询 List ,同时方法中 ...

  4. localdatetime转化为date_为啥你用@JsonFormat注解时,LocalDateTime会反序列化失败?

    写在前面 最近,有个小伙伴问我:我在SpringBoot项目中,使用@JsonFormat注解标注LocalDateTime类型的字段时,LocalDateTime反序列化失败,这个我该怎么处理呢?别 ...

  5. redis执行失败后的处理

    以前工作那会儿,总是在很纠结redis执行失败了怎么处理.最主要的是两个问题 redis执行失败了怎么处理程序? redis事务中间有一条或者某几条数据执行失败了怎么处理?特别是redis事务,一直强 ...

  6. 项目优化:当使用redis减少数据库压力时,遇到redis写入失败,造成读取数据问题的解决方案

    场景: 我们项目用到了mq,有一个专门的服务在跑异步任务去发mq,这个mq的数据不是从数据库里面查的,而是从redis里面取的,之所以这么做,有两个原因: 1.使用redis减少数据库的压力: 2.本 ...

  7. JSON反序列化失败:although at least one Creator exists): can only instantiate non-static inner class by usi

    背景:使用restTemplate推送数据给第三方时,ResponseEntity内部反序列化失败. @Slf4j @Component public class MessagePush {@Valu ...

  8. 重启宝塔redis启动失败,pid file is exits

    重启宝塔redis启动失败 查看状态: [root@localhost ~]# service redis status Redis is not running, buy pid file is e ...

  9. redis zset转set 反序列化失败_7000字 Redis 超详细总结、笔记!建议收藏

    Redis 简介 Redis 是完全开源免费的,遵守 BSD 协议,是一个高性能的 key - value 数据库 Redis 与 其他 key - value 缓存产品有以下三个特点: Redis ...

  10. redis zset转set 反序列化失败_关于Redis中的五种数据结构,要知其然知其所以然...

    Redis作为Nosql的代表,想必大家已经再熟悉不过了,除了作为缓存来使用,Redis还提供了其他很多有用的功能,例如可作为消息队列.分布式锁.不隆过滤器.限流等功能使用.今天先来说一说redis作 ...

最新文章

  1. java p7 数字签名,p7结构的数字信封 | 学步园
  2. 【数据结构总结1】-数据结构的自述
  3. (翻译) MongoDB(7) 安装MongoDB
  4. Win2003下Exchange2003部署图解之二
  5. redis 安装测试
  6. 抄袭一些别人工作中的小技巧
  7. Triangle Counting【数学】
  8. Java垃圾回收精粹 — Part4
  9. cheat engine 将选中目标的函数_EXCEL函数与公式剖析:IF
  10. 机器学习的13种算法和4种学习方法,推荐给大家
  11. EasyUI【DataGrid数据查询】
  12. 云服务器多个项目同时迁移至另一台服务器(阿里腾讯共享镜像用法)
  13. 由于正在等待重启以完成windows更新,因此Deep Freeze冰点无法安装的解决方法
  14. MAT常见泄漏Problem Suspect解析
  15. PTA7-12 城市间紧急救援 (25 分)(dijkstra+dp)(简单易懂的写法)
  16. 基于图像重建损失的无监督变化检测
  17. 关于STM32浮点运算单元FPU的小话题
  18. 微信支付:如何打造移动支付时代的高可用收银系统?
  19. PPT让图片位于形状的最中央---对齐选项卡,外部粗边框
  20. 名片大小的FPGA?方便固定又坚固耐用

热门文章

  1. MySQL8.0局域网共享
  2. vue项目中样式重置 自动注入less
  3. 疫情期间华为面试总结
  4. 找回任务栏显示桌面图标及Win7如何显示快速启动栏
  5. Kong 开源的服务网格Kuma爬过了K8S这座大山
  6. Jpeg怎么变成jpg格式?教你三步快速转换格式
  7. 2018年世界人口排名及国土面积
  8. 18款表白源码,搭建网站必备,总有一款适合你
  9. mysqldatareader什么意思_Mysql的MySqlDataReader对于MysqlConnection是独占式
  10. 如何用电影摄影来破解大脑