当前位置: 首页 > 知识库问答 >
问题:

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

荀学文
2023-03-14

我在main方法中有阻止程序问题“关闭此“ConfigurableApplication ationContext”

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个答案

公孙琛
2023-03-14

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

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

@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)

孟鸿朗
2023-03-14

如果您有一个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会话保持打开状态时,我注意到了这一点。

朱丰
2023-03-14

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

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

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

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

 类似资料:
  • ** 注意:当我尝试使用具有相同命令的Jenkins job关闭服务器时(并且运行的Jenkins服务器具有与本地服务器相同的pom和属性),我得到了以下异常:

  • 我尝试了一个显示其他响应的测试用例,我将一步一步地解释它: > 我在我的设备上安装了MDM配置文件,这提示我安装了一个应用程序,并且我成功地安装了它。应用程序已进入“应用程序中的配置文件”部分。 然后我手动删除了应用程序。

  • < b >想改进这个问题?通过编辑此帖子添加详细信息并澄清问题。 我正在尝试将一个日食项目从 GitHub 导入到智能中。但是,我在找出正确的方法时遇到了问题。 我正在按照这个问题进行导入(我将所有内容都保留为默认值,只需单击“下一步”,因为答案没有提到其他内容,我也不知道其他内容做了什么),但它仍然不起作用。配置/项目结构似乎严重损坏,我不知道为什么。 因为这里有这么多未知的东西,所以我决定问问

  • 在单元测试中启动和正常关闭Spring应用程序的推荐方法是什么?我知道JUnit5的SpringExtension,但它在测试方法执行之前/之后启动和停止Spring上下文。 我想用测试方法启动和停止spring上下文,因为我想验证是否调用了某些方法(尤其是在关机期间)。 有没有推荐的方法来实现这一点?

  • 我使用spring application builder从父应用程序运行子上下文应用程序(spring Cloud task)。我还将运行的父上下文传递给子应用程序的构建器——它定义了DataSource bean,我希望它也能被task使用。 我的问题是,当关闭子上下文时,所有父bean也会被销毁。我做错什么了吗? 如何将父上下文中的bean与子上下文共享,并且在子上下文退出时仍然保持它们的活