org.springframework.data.redis.serializer.SerializationException: Cannot serialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to serialize object using DefaultSerializer; nested exception is java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [com.tang.pojo.User]
这是因为redis要求存入的对象必须序列化,不然会报没有序列化的错误。如下图,就是没有序列化的对象。
我们只需要继承一个接口就能实现对象序列化了
这样就不会报错了。
springboot整合redis默认使用的是jdk序列化,不管是键还是值都是jdk序列化,我们要自己定义一个RedisTemplate,改成json序列化。不然在控制台查看redis的内容会有乱码,如下所示:
更改序列化规则之后,控制台就没有乱码了,如图:
如何更改序列化规则呢?我们只需要定义一个自己的RedisConfig,然后在里面定义自己的RedisTemplate即可:
@Configuration
public class RedisConfig {
// 自定义redisTemplate
@Bean
@SuppressWarnings("all")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
//我们为了开发方方便,一般使用<String, Object>
RedisTemplate<String, Object> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
// 进行序列化配置
// 1. json序列化
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);
// 2. String序列化
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的方式序列化,value采用json格式
template.setKeySerializer(stringRedisSerializer);
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的key也采用String的方式序列化,value采用json格式
template.setHashKeySerializer(stringRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
版权声明:本文为qq_47188967原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。