【问题标题】:@Qualifier is not working@Qualifier 不起作用
【发布时间】:2018-01-16 15:15:22
【问题描述】:

我有 3 个数据源,我设置如下:

@Configuration
@Component
public class DataSourceConfig {

    @Bean("foo")
    @ConfigurationProperties(prefix = "spring.datasource.foo")
    public DataSource foo() {
        DataSource dataSource = DataSourceBuilder.create().build();
        return dataSource;
    }

    @Bean("bar")
    @ConfigurationProperties(prefix = "spring.datasource.bar")
    public DataSource bar() {
        DataSource dataSource = DataSourceBuilder.create().build();
        return dataSource;
    }

    @Bean("baz")
    @ConfigurationProperties(prefix = "spring.datasource.baz")
    public DataSource baz() {
        DataSource dataSource = DataSourceBuilder.create().build();
        return dataSource;
    }

}

我正在尝试将它们自动连接到我的消费者类中,如下所示:

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

@Component
public class MyClass {

    @Autowired
    public MyClass(
            @Autowired @Qualifier("foo") DataSource foo,
            @Autowired @Qualifier("bar") DataSource bar,
            @Autowired @Qualifier("baz") DataSource baz
            ) {
        ;
    }

}

当应用程序尝试启动时,我收到错误:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of constructor in com.example.mypackage.MyClass required a single bean, but 3 were found:
    - foo: defined by method 'foo' in class path resource [com/example/DataSourceConfig.class]
    - bar: defined by method 'bar' in class path resource [com/example/DataSourceConfig.class]
    - baz: defined by method 'baz' in class path resource [com/example/DataSourceConfig.class] 

为什么@Qualifier 不起作用?

我正在使用 Spring Boot 1.5.6.RELEASE

【问题讨论】:

  • 尝试从构造函数参数中删除@Autowired。 (在Myclass 构造函数上方只留下一个)。如果不清楚,请保留@Qualifier
  • @Oleg 运气不好 :(
  • 奇怪,即使没有命名 bean 和 @Qualifier 也对我有用。仅基于方法和参数名称。我使用的是 Spring 4,但不是 5。
  • 为我工作。见this sample
  • 关于这个问题的任何更新?

标签: spring spring-boot dependency-injection spring-4


【解决方案1】:

此解决方案解决了有问题的问题,但它不能呈现完整的工作配置。

  1. 设置主数据库。
  2. 更改构造函数格式。

MyClass.java

@Component
public class MyClass {

    private final DataSource foo;
    private final DataSource bar;
    private final DataSource baz;

    @Autowired
    public MyClass(@Qualifier("foo") DataSource foo,
                   @Qualifier("bar") DataSource bar,
                   @Qualifier("baz") DataSource baz) {

        this.foo = foo;
        this.bar = bar;
        this.baz = baz;

    }

}

DataSourceConfig.java

@Configuration
@Component
public class DataSourceConfig {

    @Primary
    @Bean("foo")
    @ConfigurationProperties(prefix = "spring.datasource.foo")
    public DataSource foo() {
        DataSource dataSource = DataSourceBuilder.create().build();
        return dataSource;
    }

    @Bean("bar")
    @ConfigurationProperties(prefix = "spring.datasource.bar")
    public DataSource bar() {
        DataSource dataSource = DataSourceBuilder.create().build();
        return dataSource;
    }

    @Bean("baz")
    @ConfigurationProperties(prefix = "spring.datasource.baz")
    public DataSource baz() {
        DataSource dataSource = DataSourceBuilder.create().build();
        return dataSource;
    }

}

这会留下错误org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set。为此,我建议关注this question,因为它关注问题的主题,而这个问题围绕@Bean 名称并使用@Qualifier 引用它们。

【讨论】:

    【解决方案2】:

    试试这个:

    import javax.sql.DataSource;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.stereotype.Component;
    
        @Component
        public class MyClass {
    
        private DataSource foo;
        private DataSource bar; 
        private DataSource baz;
    
        @Autowired
        public MyClass(
                @Qualifier("foo") final DataSource foo,
                @Qualifier("bar") final DataSource bar,
                @Qualifier("baz") final DataSource baz
                ) {
            ;
        }
    
    }
    

    【讨论】:

    • 我昨晚尝试了这个作为测试,没有运气。他遇到了同样的错误。
    【解决方案3】:

    通过添加 @Primary 注释使其中一个 bean 成为主要的。然后应该识别限定符。

    【讨论】:

      猜你喜欢
      • 2016-12-05
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      • 1970-01-01
      • 1970-01-01
      • 2018-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多