web-dev-qa-db-ja.com

SonarQubeは、Spring Bootプロジェクトの「このConfigurableApplicationContextを閉じる」

メインメソッドにブロッカーの問題「この「ConfigurableApplicationContext」を閉じる」があります

public static void main(String[] args)
{
    SpringApplication.run(MyApplication.class, args);
}

SonarQubeの例のコードを試しました

public static void main(String[] args)
{
    ConfigurableApplicationContext context = null;
    try
    {
        context = SpringApplication.run(MyApplication.class, args);
    }
    finally
    {
        if (context != null) {
            context.close();
        }
    }
}

ただし、開始直後にコンテキストを閉じます。

この問題を修正するには?

20
kimreik

SonarQubeが報告している問題は誤検知であり、無視する必要があります。 SonarQubeのFAQ は、誤検知を除去するためのいくつかのオプションをリストしています。

偽陽性で修正されない

問題のインターフェースを使用して、個々の問題をFalse Positiveまたは未修正としてマークできます。ただし、このソリューションはブランチ間では機能しません。分析中のブランチごとに問題をFalse Positiveとマークし直す必要があります。そのため、プロジェクトの複数のブランチが分析中の場合、コード内アプローチが望ましい場合があります。

// NOSONAR

ルールエンジンに組み込まれたメカニズム(// NOPMD ...)またはSonarQubeに実装された汎用メカニズムを使用できます。問題の行末に// NOSONARを配置します。これにより、問題が抑制されます。

スイッチオフの問題

ユーザーインターフェイスから直接、問題を確認して誤検出としてフラグを立てることができます。

24
Andy Wilkinson

Webアプリケーションを使用している場合、アプリケーションコンテキストは破棄されます(ContextLoaderListenerによると、確かではありません)、明示的なコードは必要ありません。

コマンドラインアプリケーションの場合、コンテキストは手動で破棄する必要があります。そうしないと、Beanは適切に破棄されません-@PreDestroyメソッドは呼び出されません。例えば:

@Bean
public ApplicationRunner applicationRunner() {
    return new ApplicationRunner() {
        public void run(ApplicationArguments args) throws Exception {

            try {
                doStuff();
            } finally {
                context.close();
            }
        }

春のブートコマンドラインアプリケーションが終了した後、Cassandraセッションが開いたままになったときにこれに気付きました。

1
Assen Kolov

私はいつもそれが偽/ポジティブだと思っていました。

しかし、この数行でこれをテストできます。

@RunWith(SpringRunner.class)
@SpringBootTest
public class YourApplicationTest {

    @Test
    public void shouldLoadApplicationContext() {
    }

    @Test
    public void applicationTest() {
        YourApplication.main(new String[] {});
    }

}

今ソナーは言っています、これはテストされています!
(Kudos out to:Robert @ https://stackoverflow.com/a/41775613/8634

1
Joerg