Spring 引导:测试和主要之间的 NoUniqueBeanDefinitionException
Spring Boot: NoUniqueBeanDefinitionException between test and main
我有一个 SpringBoot main/Application.java class
@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 组件。
在尝试了一天多的不同方法来排除不需要的 bean 之后,核心问题原来是 @ComponentScan 同时引入了 Application 和 ApplicationTest,导致对 Application 进行了额外的扫描,从而导致正在加载不需要的服务。
解决方法,补充:
@ComponentScan.Filter(value = Application.class, type = FilterType.ASSIGNABLE_TYPE)
到 ApplicationTestConfig.java 中的列表。因此,当加载 ApplicationTestConfig 并触发组件扫描时,它会忽略应用程序(以及应用程序的所有特定配置)。
我有一个 SpringBoot main/Application.java class
@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 组件。
在尝试了一天多的不同方法来排除不需要的 bean 之后,核心问题原来是 @ComponentScan 同时引入了 Application 和 ApplicationTest,导致对 Application 进行了额外的扫描,从而导致正在加载不需要的服务。
解决方法,补充:
@ComponentScan.Filter(value = Application.class, type = FilterType.ASSIGNABLE_TYPE)
到 ApplicationTestConfig.java 中的列表。因此,当加载 ApplicationTestConfig 并触发组件扫描时,它会忽略应用程序(以及应用程序的所有特定配置)。