总结自定义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自身替换序列出现的问题,如果大家有其他理解欢迎留言评论。
![]()