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 を除外するためにさまざまな方法を 1 日以上試した結果、中心的な問題は、@ComponentScan が Application と ApplicationTest の両方を取り込み、アプリケーションの追加スキャンが行われ、不要なサービスが読み込まれるという事実であることが判明しました。 .

解決策、追加:

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

ApplicationTestConfig.java のリストに追加します。そのため、ApplicationTestConfig がロードされ、コンポーネント スキャンがトリガーされると、アプリケーション (およびアプリケーションの特定の構成のすべて) が無視されます。

于 2015-06-25T18:48:23.257 に答える