SonarQube在Spring Boot项目中“关闭此ConfigurableApplicationContext”

时间:2016-05-06 11:17:15

标签: java spring spring-boot sonarqube

我在主方法

中遇到阻止问题“关闭此”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();
        }
    }
}

但它会在开始后立即关闭上下文。

如何解决此问题?

3 个答案:

答案 0 :(得分:24)

SonarQube报告的问题是误报,应该被忽略。 SonarQube's FAQ列出了一些消除误报的选项:

  

假阳性且无法修复

     

您可以将个别问题标记为误报或通过问题界面修复。但是,此解决方案并不适用于分支机构 - 您必须为正在分析的每个分支重新标记问题误报。因此,如果正在分析项目的多个分支,则可能更喜欢使用代码内方法:

     

// NOSONAR

     

您可以使用规则引擎中嵌入的机制(// NOPMD ...)或SonarQube中实现的通用机制:将// NOSONAR放在问题行的末尾。这将解决这个问题。

     

关闭问题

     

您可以查看问题,直接从用户界面将其标记为误报。

答案 1 :(得分:1)

如果您有一个Web应用程序,应用程序上下文将被销毁(我认为ContextLoaderListener,不确定),不需要显式代码。

对于命令行应用程序,必须手动销毁上下文,否则将无法正确销毁bean - 不会调用@PreDestroy方法。 E.g:

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

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

在我的spring boot命令行应用程序完成后,当Cassandra会话保持打开时,我注意到了这一点。

答案 2 :(得分:1)

我一直在想,这是假的/积极的。

但你可以用这几行来测试它。

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

    @Test
    public void shouldLoadApplicationContext() {
    }

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

}
现在声纳说,这是经过测试的!
(Kudos出去:Robert @ https://stackoverflow.com/a/41775613/863403