在Spring Boot项目中,SonarQube“关闭此ConfigurableApplicationContext”的含义是什么?

22

我在主方法中遇到了一个阻塞问题:“Close this "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();
        }
    }
}

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

如何解决这个问题?


2
我们实际上正在寻求有关此链接的反馈意见:https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/sonarqube/Omg-sEBEneU/Gx8wdHGGAwAJ 请随意发表意见,以便我们可以改进规则。 - benzonico
3个回答

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

误报和不修复

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

//NOSONAR

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

关闭问题

您可以查看问题以直接将其标记为误报。


8
虽然 //NOSONAR 能够生效,但它会禁用该行代码的所有 Sonar 检查。为了达到同样的效果,可以针对单个规则进行禁用,比如在主方法上添加 @SuppressWarnings("squid:S2095") 即可。注意不要改变原文意思。 - NikhilWanpal

1

我一直认为这是假阳性。

但你可以用几行代码来测试这个。

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

    @Test
    public void shouldLoadApplicationContext() {
    }

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

}

现在Sonar说,这已经经过测试!(感谢Robert @ https://dev59.com/BFgR5IYBdhLWcg3wEZ6V#41775613

1
如果您有一个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会话仍然保持打开状态。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接