SpringBoot整合Redis时Jackson2JsonRedisSerializer问题
在学习redis和SpringBoot整合时,遇到了一个序列化与反序列化的问题。
Redis的配置类
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
RedisSerializer<String> redisSerializer = new 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.setConnectionFactory(factory);
//key序列化方式
template.setKeySerializer(redisSerializer);
//value序列化
template.setValueSerializer(jackson2JsonRedisSerializer);
//value hashmap序列化
template.setHashValueSerializer(jackson2JsonRedisSerializer);
return template;
}
测试方法:
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testRedis(){
String testRedisSpringBoot = (String) redisTemplate.opsForValue().get("stringType");
System.out.println(testRedisSpringBoot);
}
错误信息
at [Source: (byte[])"string"; line: 1, column: 7]; nested exception is com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'string': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
错误原因:
因为我获取的stringType这个键值对的值是我在学习reids命令的时候在redis-cli客户端手动添加的,也就是说该键值对没用经过序列化操作,所有在获取该键的值时反序列化操作出错
如果是通过redisTemplate.opsForValue().set();方法存储在redis中的数据就能正常获取
@Test
public void testRedis(){
redisTemplate.opsForValue().set("testRedis","test111111");
String testRedisSpringBoot = (String) redisTemplate.opsForValue().get("testRedis");
System.out.println(testRedisSpringBoot);
}
我是看到这篇文章然后结合评论区才反应过来错误在哪
https://blog.csdn.net/u010013573/article/details/85420431
在序列化与反序列化操作中需要使用相同的序列化类来进行,否则可能会解析失败
也不知道我理解对了没有,如果有理解不对的地方,欢迎大佬指出错误