【问题标题】:Spring @Configuration is ignoredSpring @Configuration 被忽略
【发布时间】:2018-07-26 11:45:52
【问题描述】:

我将以下 dbunit 配置放在我所有测试类的父类中:

@Configuration
    public class MyDbUnitConfiguration {

        @Bean
        public DatabaseDataSourceConnectionFactoryBean dbUnitDatabaseConnection() {
            DatabaseConfigBean bean = new DatabaseConfigBean();
            bean.setDatatypeFactory(new MySqlDataTypeFactory());
            bean.setMetadataHandler(new MySqlMetadataHandler());
            bean.setSkipOracleRecyclebinTables(true);
            bean.setCaseSensitiveTableNames(false);
            bean.setAllowEmptyFields(true);

            String testDbName = getTestDbName();
            LOG.debug("Test database name: " + testDbName);
            DataSource dataSource = new DataSource();
            dataSource.setUsername(USERNAME);
            dataSource.setPassword(PASSWORD);
            dataSource.setDriverClassName(JDBC_DRIVER);
            String url = "jdbc:mysql://localhost:3306/" + testDbName;
            dataSource.setUrl(url);

            DatabaseDataSourceConnectionFactoryBean dbConnectionFactory = new DatabaseDataSourceConnectionFactoryBean(
                    dataSource);
            dbConnectionFactory.setDatabaseConfig(bean);

            return dbConnectionFactory;
        }
    }

但是,当我运行任何子测试类时,此配置会被忽略(没有打印日志并且实际上没有设置属性)。

当我在子测试类上放@Component注解时使用该配置,但@Component只能使用一次,否则会打印异常:

org.springframework.beans.factory.NoUniqueBeanDefinitionException:
No qualifying bean of type 'MyBaseTest' available: expected single matching bean but found 2: 
FooTest,BarTest

因此我不能在每个子测试类上都添加@Component 注解。

如果将@Component注解放在父测试类上,则不会加载配置。

备注: 每个子测试类使用不同的数据库,使用方法getTestDbName() 检索其名称。我需要这些信息来配置我的数据库连接。

在运行每个子测试类之前加载配置的正确方法是什么?这是 dbunit 将用来加载测试数据集的配置。

【问题讨论】:

  • 检查扫描包配置
  • 项目的主类有注释@ComponentScan(basePackages = { "a.b.c.mypackage.*" }),它应该加载MyBaseTest类。
  • 错误显示您创建了 2 个具有相同对象名称的 bean。更改一个 bean 的对象名称
  • 在每个子测试类上添加@Component注解时,父类的同一个配置bean被加载了两次,导致错误。但是我可能需要加载配置两次。

标签: java spring configuration spring-annotations dbunit


【解决方案1】:

仔细阅读错误:

没有可用的“MyBaseTest”类型的合格 bean:预期单个匹配 bean,但找到了 2: FooTest,BarTest

Spring 默认按类型自动装配,并找到两个相同类型的 bean,名为 FooTestBarTest 有两种直接的修复方法:

  • 取出一颗豆子
  • 使用@Qualifier("FooTest") 注释和@Autowired 注释来定义哪个bean 是候选使用。

【讨论】:

    【解决方案2】:

    注解@DbUnitConfiguration救了我。 我能够通过在每个子测试类上添加以下注释来配置它们:

    @Component
    @DbUnitConfiguration(databaseConnection = { "myDbUnitConfigurationBean" })
    public class FooTest extends MyBaseTest {
    

    然后在每个子测试类中放置一个配置 bean(并指定 bean 的名称):

    @Bean(name = "myDbUnitConfigurationBean")
    public DatabaseDataSourceConnectionFactoryBean getDbUnitDatabaseConnection() {
        return createDbUnitDatabaseConnection(getTestDbName());
    }
    

    我还可以通过在父测试类中定义方法 createDbUnitDatabaseConnection() 来分解一些代码:

    protected final DatabaseDataSourceConnectionFactoryBean createDbUnitDatabaseConnection(String testDbName) {
        DatabaseConfigBean bean = new DatabaseConfigBean();
        bean.setDatatypeFactory(new MySqlDataTypeFactory());
        bean.setMetadataHandler(new MySqlMetadataHandler());
        bean.setSkipOracleRecyclebinTables(true);
        bean.setCaseSensitiveTableNames(false);
        bean.setAllowEmptyFields(true);
    
        LOG.debug("Test database name: " + testDbName);
        DataSource dataSource = new DataSource();
        dataSource.setUsername(USERNAME);
        dataSource.setPassword(PASSWORD);
        dataSource.setDriverClassName(JDBC_DRIVER);
        String url = "jdbc:mysql://localhost:3306/" + testDbName;
        dataSource.setUrl(url);
    
        DatabaseDataSourceConnectionFactoryBean dbConnectionFactory = new DatabaseDataSourceConnectionFactoryBean(
                dataSource);
        dbConnectionFactory.setDatabaseConfig(bean);
    
        return dbConnectionFactory;
    }
    

    现在每个子测试类都加载了我的 DbUnit 配置,这正是我想要的。

    【讨论】:

      猜你喜欢
      • 2014-04-28
      • 2020-05-07
      • 1970-01-01
      • 2020-03-12
      • 1970-01-01
      • 2012-05-19
      • 2015-08-03
      • 2021-08-26
      • 2021-11-04
      相关资源
      最近更新 更多