文章
问答
冒泡
封装common包时注入问题

最近在做一个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

问题很简单,却是因为一个小小的不在意导致的。


关于作者

Dane.shang
快30岁了还没去过酒吧
获得点赞
文章被阅读