3

我有一个 SpringBoot main/Application.java 类

@SpringBootApplication
@ComponentScan(value = "com.nfl.dm.shield", excludeFilters =
        {
                @ComponentScan.Filter(value = MemoryRepository.class, type = FilterType.ASSIGNABLE_TYPE)
        }
)
public class Application {

    final static Logger LOG = LoggerFactory.getLogger(Application.class);

    public static void main(String[] args) {
        LOG.info("Booting application...");
        SpringApplication.run(Application.class, args);
    }
}

和一个类似的测试

@Configuration
@ComponentScan(basePackages = {"com.nfl.dm.shield"}, excludeFilters =
        {
                @ComponentScan.Filter(value = MySqlRepository.class, type = FilterType.ASSIGNABLE_TYPE)
        }
)
public class ApplicationTestConfig {
}

主代码运行正常。测试代码抛出 NoUniqueBeanDefinitionException,似乎没有正确过滤掉不需要的 MySqlRepository 组件。

4

1 回答 1

3

在尝试了一天多不同的方法来排除不需要的 bean 之后,核心问题原来是 @ComponentScan 同时拉入 Application 和 ApplicationTest,导致对 Application 的额外扫描,从而导致加载了不需要的服务.

解决方案,添加:

                @ComponentScan.Filter(value = Application.class, type = FilterType.ASSIGNABLE_TYPE)

到 ApplicationTestConfig.java 中的列表。因此,当 ApplicationTestConfig 被加载并触发组件扫描时,它会忽略 Application(以及所有 Application 的特定配置)。

于 2015-06-25T18:48:23.257 回答