【问题标题】:SonarQube "Close this ConfigurableApplicationContext" in Spring Boot projectSpring Boot 项目中的 SonarQube“关闭此 ConfigurableApplicationContext”
【发布时间】:2016-09-01 10:44:31
【问题描述】:

我在主方法中遇到了阻塞问题“关闭此“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();
        }
    }
}

但它会在启动后立即关闭上下文。

如何解决这个问题?

【问题讨论】:

标签: java spring spring-boot sonarqube


【解决方案1】:

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

误报且无法修复

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

//NOSONAR

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

关闭问题

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

【讨论】:

  • 虽然 //NOSONAR 有效,但它会禁用所有声纳检查,尽管仅针对该行。另一种方法是专门禁用对单个规则的检查;在这种情况下,您可以通过在 main 方法中添加 @SuppressWarnings("squid:S2095") 来做到这一点。
【解决方案2】:

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

在命令行应用程序的情况下,必须手动销毁上下文,否则 bean 将无法正确销毁 - 不会调用 @PreDestroy 方法。例如:

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

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

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

【讨论】:

    【解决方案3】:

    我一直在想,这是错误的/肯定的。

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

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class YourApplicationTest {
    
        @Test
        public void shouldLoadApplicationContext() {
        }
    
        @Test
        public void applicationTest() {
            YourApplication.main(new String[] {});
        }
    
    }
    

    现在声纳说,这是经过测试的!
    (感谢:罗伯特@https://stackoverflow.com/a/41775613/863403

    【讨论】:

      猜你喜欢
      • 2018-11-12
      • 2021-07-09
      • 2021-08-01
      • 2021-05-29
      • 2017-04-15
      • 2014-08-16
      • 2019-04-06
      • 2020-06-19
      • 1970-01-01
      相关资源
      最近更新 更多