栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Could not read JSON jackson无法序列化SimpleGrantedAuthority异常

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Could not read JSON jackson无法序列化SimpleGrantedAuthority异常

前言

用Spring Security时需要用到一个基础类,UserDetails,这个类要求有一个接口是getAuthorities,这个接口返回的默认值是HashSet,这个SimpleGrantedAuthority没有无参构造函数,所以在反序列化的时候会报错。

解决方案 添加自定义反序列化器
@JsonDeserialize(using = CustomAuthorityDeserializer.class)
private Collection authorities;

在无法反序列化的对象上加上如上注解即可。

加上还是没有用

我遇到的情况加上还是没有用,系统里的RedisTemplate是自定义的,这里的序列化策略也是自定义的,代码如下

@Bean
@Primary
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
    RedisTemplate redisTemplate = new RedisTemplate<>();
    redisTemplate.setKeySerializer(RedisSerializer.string());
    redisTemplate.setHashKeySerializer(RedisSerializer.string());
    redisTemplate.setValueSerializer(RedisSerializer.json());
    redisTemplate.setHashValueSerializer(RedisSerializer.json());
    redisTemplate.setConnectionFactory(redisConnectionFactory);

    return redisTemplate;
}

问题就出在这个
RedisSerializer.json()
上,他默认调用GenericJackson2JsonRedisSerializer的无参构造函数,无参构造函数里用的ObjectMapper是new出来的不是全局bean,而当我们在属性上加注解时他只能影响全局ObjectMapper,所以导致加上之后还是没用。
把上述代码改成如下即可

@Bean
@Primary
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory, ObjectMapper objectMapper) {
    RedisTemplate redisTemplate = new RedisTemplate<>();
    redisTemplate.setKeySerializer(RedisSerializer.string());
    redisTemplate.setHashKeySerializer(RedisSerializer.string());
    redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer(objectMapper));
    redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer(objectMapper));
    redisTemplate.setConnectionFactory(redisConnectionFactory);

    return redisTemplate;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/314845.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号