乱码问题的出现和解决方法
1.把相关依赖导入项目后,Springboot就自动帮我们生成了Template类,分别是RedisTemplate和StringRedisTemplate。实际上StringRedisTemplate是RedisTemplate的子类,对于String类型,它的类型只能是String的,会有类型检查上的安全;而RedisTemplate可以操作任何类型。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.本次我通过RedisTemplate对Redis进行操作,所以我们需要将它注入进来。
@Autowired
private RedisTemplate<Object, Object> redisTemplate;
3.结果发现使用spring向redis中存数据时,发现key出现了很不友好的字符(出现了乱码)
4.通过多方查资料,大致问题原因是RedisTemplate默认的序列化类用的是其他的,所以序列化后的数据我们看不懂。
最终选择如下解决办法:手动定义序列化的方法
自定义一个新的RedisTemplate以覆盖旧的,在定义的时候指定序列化类,代码如下:
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@SpringBootConfiguration
public class RedisConfiguration {
@Bean
public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<Object,Object> redisTemplate = new RedisTemplate<>();
// 设置redis连接
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 使用Jackson2JsonRedisSerialize 替换默认序列化
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
// 设置value的序列化规则和 key的序列化规则
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
// 将redisTemplate的序列化方式更改为StringRedisSerializer
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
到此,问题解决!
原文参考:http://t.csdnimg.cn/ZqLSf