メインメソッドにブロッカーの問題「この「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();
}
}
}
ただし、開始直後にコンテキストを閉じます。
この問題を修正するには?
SonarQubeが報告している問題は誤検知であり、無視する必要があります。 SonarQubeのFAQ は、誤検知を除去するためのいくつかのオプションをリストしています。
偽陽性で修正されない
問題のインターフェースを使用して、個々の問題をFalse Positiveまたは未修正としてマークできます。ただし、このソリューションはブランチ間では機能しません。分析中のブランチごとに問題をFalse Positiveとマークし直す必要があります。そのため、プロジェクトの複数のブランチが分析中の場合、コード内アプローチが望ましい場合があります。
// NOSONAR
ルールエンジンに組み込まれたメカニズム(// NOPMD ...)またはSonarQubeに実装された汎用メカニズムを使用できます。問題の行末に// NOSONARを配置します。これにより、問題が抑制されます。
スイッチオフの問題
ユーザーインターフェイスから直接、問題を確認して誤検出としてフラグを立てることができます。
Webアプリケーションを使用している場合、アプリケーションコンテキストは破棄されます(ContextLoaderListener
によると、確かではありません)、明示的なコードは必要ありません。
コマンドラインアプリケーションの場合、コンテキストは手動で破棄する必要があります。そうしないと、Beanは適切に破棄されません-@PreDestroyメソッドは呼び出されません。例えば:
@Bean
public ApplicationRunner applicationRunner() {
return new ApplicationRunner() {
public void run(ApplicationArguments args) throws Exception {
try {
doStuff();
} finally {
context.close();
}
}
春のブートコマンドラインアプリケーションが終了した後、Cassandraセッションが開いたままになったときにこれに気付きました。
私はいつもそれが偽/ポジティブだと思っていました。
しかし、この数行でこれをテストできます。
@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 )