Redis缓存获取时出现Jackson反序列化失败

错误日志:

       org.springframework.data.redis.serializer.SerializationException: Could not read JSON: Unrecognized field "name" (class com.xx.xx.Xx), not marked as ignorable (14 known

properties)

分析:

  1. 根据错误提⽰可以⼤概知道,Redis在反序列化的时候失败,没有找到对应的属性可以进⾏反序列化,并且给出了解决提⽰name 没有标记忽略
  2. 写了⼀个序列化测试类,发现jackson 序列化会对 getter ⽅法进⾏序列化,序列化的key 为 getter⽅法的名字 ,如 getName 则key为 name , value 为 ⽅法的返回值。但是直接通过 Jackson的 readValue⽅法反序列化时,并没有报以上错误,反序列化正常。通过断点调试发现⼀般对 bean 进⾏反序列化会使⽤类提供的⽅法,⽽看错误栈的最底层会发现 报错的反序列化类 是BeanSerializer 。

原因:

        在类中原来有个name ,废弃后删除name,但是Redis中存在缓存,废弃后的代码获取缓存时导致反序列化失败。

解决方案:

  •  解决⽅法⼀ :在类上添加 注解@JsonIgnoreProperties(ignoreUnknown = true)
  •  解决⽅法⼆ :除属性的getter ⽅法外,其他⽅法不要以get开通

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在Spring Security OAuth2中,缓存的处理可以使用Jackson进行序列化。具体实现步骤如下: 1. 添加Jackson依赖 在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> ``` 2. 实现序列化器 创建一个自定义的序列化器,继承自`JsonSerializer`: ```java public class OAuth2AccessTokenSerializer extends JsonSerializer<OAuth2AccessToken> { @Override public void serialize(OAuth2AccessToken token, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException { gen.writeStartObject(); gen.writeStringField("value", token.getValue()); gen.writeNumberField("expiration", token.getExpiration().getTime()); // 其他字段序列化 gen.writeEndObject(); } } ``` 3. 注册序列化器 在配置类中注册序列化器: ```java @Configuration public class JacksonConfiguration { @Bean public ObjectMapper objectMapper() { ObjectMapper objectMapper = new ObjectMapper(); SimpleModule module = new SimpleModule(); module.addSerializer(OAuth2AccessToken.class, new OAuth2AccessTokenSerializer()); objectMapper.registerModule(module); return objectMapper; } } ``` 4. 配置缓存缓存配置类中,指定序列化器: ```java @Configuration @EnableCaching public class CacheConfiguration extends CachingConfigurerSupport { @Autowired private ObjectMapper objectMapper; @Bean public CacheManager cacheManager(RedisConnectionFactory connectionFactory) { RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new Jackson2JsonRedisSerializer<>(OAuth2AccessToken.class, objectMapper))); return RedisCacheManager.builder(connectionFactory) .cacheDefaults(config) .build(); } } ``` 这样就可以使用Jackson进行缓存的序列化了。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值