SonarQube“关闭此可配置应用程序上下文”在Spring Boot项目中

2022-09-02 01:28:59

我在主方法中有阻止程序问题“关闭此”可配置应用程序上下文“”

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();
        }
    }
}

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

如何解决此问题?


答案 1

SonarQube报告的问题是误报,应该被忽略。SonarQube的常见问题解答列出了一些用于删除误报的选项:

误报且无法修复

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

诺索纳

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

关机问题

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


答案 2

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

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

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

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

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


推荐