spring 中配置两个redis导致的NoUniqueBeanDefinitionException异常

背景

容器里配置两个RedisConnectFactory实例,报错如下

Description:

Parameter 0 of method redisTemplate in org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration$RedisConfiguration required a single bean, but 2 were found:
    - desCacheJedisConnectionFactory: defined by method 'desCachejedisConnectionFactory' in class path resource [com/qingqing/des/config/RedisConfig.class]
    - apiDesJedisConnectionFactory: defined by method 'apiDesJedisConnectionFactory' in class path resource [com/qingqing/des/config/RedisConfig.class]


Action:

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed

分析

开始以为是配置的bean没有命名,都仔仔细细检查过了,重启N遍,依然出现这个问题,然后我就在异常里面看到 redisTemplate这个Bean,搜了项目里的配置,我并没有这个,所以怀疑是RedisAutoConfiguration里面自动加载了一个redisTemplate.

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'redisTemplate' defined in class path resource [org/springframework/boot/autoconfigure/data/redis/RedisAutoConfiguration$RedisConfiguration.class]: Unsatisfied dependency expressed through method 'redisTemplate' parameter 0; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.springframework.data.redis.connection.RedisConnectionFactory' available: expected single matching bean but found 2: desCacheJedisConnectionFactory,apiDesJedisConnectionFactory
 

看RedisAutoConfiguration源码发现一段:

    /**
     * Standard Redis configuration.
     */
    @Configuration
    protected static class RedisConfiguration {

        @Bean
        @ConditionalOnMissingBean(name = "redisTemplate")
        public RedisTemplate redisTemplate(
                RedisConnectionFactory redisConnectionFactory)
                        throws UnknownHostException {
            RedisTemplate template = new RedisTemplate();
            template.setConnectionFactory(redisConnectionFactory);
            return template;
        }

        @Bean
        @ConditionalOnMissingBean(StringRedisTemplate.class)
        public StringRedisTemplate stringRedisTemplate(
                RedisConnectionFactory redisConnectionFactory)
                        throws UnknownHostException {
            StringRedisTemplate template = new StringRedisTemplate();
            template.setConnectionFactory(redisConnectionFactory);
            return template;
        }

    }

ConditionalOnMissingBean这个注释表示如果容器没有这个类则加载,我的程序没有定义redisTemplate的Bean,所以这个地方自动加载了,但是容器里又有两个redisConnectionFactory,所以才报了上面的错误

结论

将配置的其中一个redisTemplate Bean的名称改为redisTemplate,这样RedisAutoConfiguration就不会再加载默认的了

你可能感兴趣的:(spring 中配置两个redis导致的NoUniqueBeanDefinitionException异常)