总结自定义redisCacheManager 缓存JSON和控制台乱码坑
环境:spring boot 2.0,jdk 1.8 ,redis 3.0.504
项目中需要用到spring boot 高级缓存组件JSR107 ,需要通过redisCacheManager管理redis到crud操作。
在使用过程中需要定制化存储JSON格式,没有配置默认形式如下:
1、查询存储代码
![]()
 
2、存储形式
![]()
 
因此需要配置以json的形式存储:
1、配置代码:
 
package controller.config;
  import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.CacheManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheConfiguration; import org.springframework.data.redis.cache.RedisCacheManager; 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.RedisSerializationContext;
  import java.time.Duration;
  /**  * @author :huadong.chen  * @ProjectName: springboot01helloword$  * @Package: com.springboot.controller.config$  * @ClassName: RedisConfig$  * @date :Created in 2020-07-12 09:55  * @description:redis配置类  * @modified By:  * @version: 1.01  */ @Configuration public class RedisConfig {
      @Autowired     private RedisTemplate redisTemplate;
      /**      * 覆盖redisTemplate      * @param redisConnectionFactory      * @return      */     @Bean     public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){         //配置具体的序列方式         Jackson2JsonRedisSerializer<Object> objectJackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);         redisTemplate.setKeySerializer(objectJackson2JsonRedisSerializer);         redisTemplate.setValueSerializer(objectJackson2JsonRedisSerializer);         redisTemplate.setConnectionFactory(redisConnectionFactory);         return redisTemplate;     }
      /**      * 自定义cache缓存机制      * @param factory      * @return      */     @Bean     public CacheManager cacheManager(RedisConnectionFactory factory){         Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);         //转换异常处理         ObjectMapper om = new ObjectMapper();         om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);         om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);         serializer.setObjectMapper(om);         RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()                 // 设置缓存过期时间为一天                 .entryTtl(Duration.ofDays(1))                 //存储序列方式                 .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer))                 .disableCachingNullValues();         RedisCacheManager build = RedisCacheManager                 .builder(factory)                 .cacheDefaults(redisCacheConfiguration)                 .build();         return build;     } } 
 | 
这里有个坑,控制台报错,乱码,如下图:
![]()
 
百思不得其解,刚开始以为是配置的序列有问题和数据源有问题,结果修改后还是不能得到解决。
最终的解决结果是把redis里面的缓存全部清除,再执行就可以正常写入,我理解这个应该是redis自身替换序列出现的问题,如果大家有其他理解欢迎留言评论。
![]()