最近在做一个hello world的小项目demo。
我就想着给公司制定一些模块的规范,例如缓存操作,日志,返回等。
在做缓存的时候,就遇到了redisTemplate注入错误的问题。
我做了一个自定义的redisTemplate配置类,如下
@EnableCaching @Configuration @ConditionalOnBean(RedisConnectionFactory.class) @AllArgsConstructor public class RedisTemplateConfig { private final RedisConnectionFactory redisConnectionFactory; @Bean(name = "womRedisTemplate") public RedisTemplate<String, Object> womRedisTemplate() { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); redisTemplate.setKeySerializer(stringRedisSerializer); redisTemplate.setHashKeySerializer(stringRedisSerializer); redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); redisTemplate.setDefaultSerializer(jackson2JsonRedisSerializer); redisTemplate.setConnectionFactory(redisConnectionFactory); return redisTemplate; } }
其中在配置类中定义了几个json的序列器,想着后面就不用管序列器的事情了。
结果在模块使用过程中,始终使用的是默认的序列器,保存到redis中的key和value都是乱码,思考过来思考过去没有找到原因。
最后跟到源码中,发现在向spring请求redisTemplate对象注入到需要的地方的时候,拿到的却是默认配置的redisTemplate对象,也就是说我的自定义配置根本没起作用。
后来排查发现,我只是在模块包中的配置类上简单加了个@Configurtaion注解。
这样其实配置是无法生效的,经过查询发现忘记在META-INF文件夹下的spring.fctories文件中开启这个配置类,导致配置无法生效,最后注入了错误的默认redisTemplate类。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.womdata.common.data.cache.RedisTemplateConfig,\ com.womdata.common.data.cache.RedisCacheManagerConfig,\ com.womdata.common.data.cache.RedisCacheAutoConfiguration,\ com.womdata.common.data.tenant.WomDataTenantConfigProperties,\ com.womdata.common.data.tenant.TenantContextHolderFilter,\ com.womdata.common.data.tenant.WomDataFeignTenantConfiguration,\ com.womdata.common.data.mybatis.MybatisPlusConfig,\ com.womdata.common.data.cache.CacheHand
这样添加了配置类到文件中,最后注入到了正确的自定义的redisTemplate
问题很简单,却是因为一个小小的不在意导致的。