我在主方法中遇到阻塞问题"关闭此"可配置的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)