SonarQube "Close this ConfigurableApplicationContext" in Spring Boot 项目



我在主方法中遇到阻塞问题"关闭此"可配置的ApplicationContext"

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的常见问题解答列出了一些消除误报的选项:

误报且无法修复

您可以通过问题界面将单个问题标记为"假阳性"或"无法修复"。然而,此解决方案不能跨分支工作——您必须为正在分析的每个分支重新标记问题"假阳性"。因此,如果一个项目的多个分支正在进行分析,那么代码内方法可能更可取:

//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[] {});
    }
}

现在声纳说,这是测试
(感谢:Robert@https://stackoverflow.com/a/41775613/863403)

最新更新