创建Bean时出错,即使依赖Bean存在

时间:2017-11-28 10:50:18

标签: java spring spring-boot

我的配置类包含一些Dependent Beans

public class WebConfig{
    @Bean
        @Qualifier("geojedis")
        public StringRedisTemplate geoJedisTemplate(
                @Qualifier("geographyJedisConnectionFactory") final JedisConnectionFactory connectionFactory) {

            // Create a RedisTemplate implementation which is basically of string
            // data structure.
            StringRedisTemplate redisTemplate = new StringRedisTemplate(connectionFactory);

            return redisTemplate;
        }

    @Bean
        @Qualifier("capacityStringRedisTemplate")
        public StringRedisTemplate capacityStringRedisTemplate(
                @Qualifier("capacityJedisConnectionFactory") final JedisConnectionFactory connectionFactory) {

            // Create a RedisTemplate implementation which is basically of string
            // data structure.
            StringRedisTemplate redisTemplate = new StringRedisTemplate(connectionFactory);

            return redisTemplate;
        }

    @Bean
        public JedisConnectionFactory geographyJedisConnectionFactory() {
            JedisConnectionFactory connectionFactory = new JedisConnectionFactory();
            return connectionFactory;
        }

    @Bean
        public JedisConnectionFactory capacityJedisConnectionFactory() {
            JedisConnectionFactory connectionFactory = new JedisConnectionFactory();
            return connectionFactory;
        }
    }

但我收到以下错误。当我检查配置时,一切都很好,我还定义了Qualifier来映射正确的依赖项。非常感谢任何帮助。

  

org.springframework.beans.factory.UnsatisfiedDependencyException:   在类路径中定义名为'redisTemplate'的bean时出错   资源   [组织/ springframework的的/ boot /自动配置/ Redis的/ RedisAutoConfiguration $ RedisConfiguration.class]:   通过构造函数参数表示不满意的依赖关系   索引0的类型   [org.springframework.data.redis.connection.RedisConnectionFactory] ​​::   没有合格的bean类型   [org.springframework.data.redis.connection.RedisConnectionFactory]是   已定义:预期单个匹配bean但找到2:   geographyJedisConnectionFactory,capacityJedisConnectionFactory;嵌套   例外是   org.springframework.beans.factory.NoUniqueBeanDefinitionException:没有   合格的bean类型   [org.springframework.data.redis.connection.RedisConnectionFactory]是   已定义:预期单个匹配bean但找到2:   geographyJedisConnectionFactory,capacityJedisConnectionFactory

2 个答案:

答案 0 :(得分:3)

如果没有默认的" redisTemplate"则会在RedisAutoConfiguration中创建一个bean。在Spring Context中。

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

这个需要一个RedisConnectionFactory,但找到两个。

作为一种解决方法,您可以使用名称&#34; redisTemplate&#34;创建一个虚拟RedisTemplate。而不是使用它。

由于它通过bean名称进行检查,只要没有尝试@Autowire就可以满足以下条件:

@Bean
public Object redisTemplate() {
    return new Object();
}

答案 1 :(得分:1)

您只需调用连接工厂bean创建方法而不是注入:

    @Bean       
    public StringRedisTemplate capacityStringRedisTemplate() {

        // Create a RedisTemplate implementation which is basically of string
        // data structure.
        StringRedisTemplate redisTemplate = 
             new StringRedisTemplate(capacityJedisConnectionFactory());

        return redisTemplate;
    }

这将直接指向您要找的那个