springboot整合redis存入一个对象时报错:org.springframework.data.redis.serializer.SerializationException: Cannot

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;
    }

}
posted @ 2022-05-15 11:48  爱吃雪糕的小布丁  阅读(819)  评论(0)    收藏  举报  来源