SonarQube "Закройте этот ConfigurableApplicationContext" в Spring Boot project
У меня проблема с блокировщиком "Закройте это" 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();
}
}
}
но он закрывает контекст сразу после запуска.
Как исправить эту проблему?
Ответы
Ответ 1
Проблема, о которой сообщает SonarQube, является ложной позицией и ее следует игнорировать. Часто задаваемые вопросы по SonarQube содержит некоторые опции для удаления ложных срабатываний:
Ложно-положительный и не будет исправлен
Вы можете отметить отдельные проблемы как ложные положительные или не исправить через интерфейс проблем. Однако это решение не работает во всех ветвях - вам придется повторно отметить проблему False Positive для каждой анализируемой ветки. Таким образом, подход в виде кода может быть предпочтительным, если анализируются несколько ветвей проекта:
//NOSONAR
Вы можете использовать механизм, встроенный в механизм правил (//NOPMD...) или общий механизм, реализованный в SonarQube: поместите //NOSONAR в конец строки проблемы. Это подавляет проблему.
Проблемы с выключением
Вы можете просмотреть проблему, чтобы пометить ее как ложную положительную информацию непосредственно из пользовательского интерфейса.
Ответ 2
Если у вас есть веб-приложение, контекст приложения будет уничтожен (я думаю, что ContextLoaderListener
, не уверен), явный код не нужен.
В случае приложения командной строки контекст должен быть уничтожен вручную, иначе beans не будет уничтожен должным образом - методы @PreDestroy не будут вызываться. Например:
@Bean
public ApplicationRunner applicationRunner() {
return new ApplicationRunner() {
public void run(ApplicationArguments args) throws Exception {
try {
doStuff();
} finally {
context.close();
}
}
Я заметил это, когда сеанс Cassandra остался открытым после того, как мое приложение командной строки загрузки spring закончилось.
Ответ 3
Я всегда думал, что это ложно/положительно.
Но вы можете проверить это с помощью нескольких строк.
@RunWith(SpringRunner.class)
@SpringBootTest
public class YourApplicationTest {
@Test
public void shouldLoadApplicationContext() {
}
@Test
public void applicationTest() {
YourApplication.main(new String[] {});
}
}
Теперь Сонар говорит: это проверено!
(Kudos выходит: Robert @fooobar.com/questions/279358/...)
Ответ 4
Я думаю, что "попробуйте стиль ресурсов" должно работать, например:
public static void main(String[] args) {
try (ConfigurableApplicationContext cont = SpringApplication.run(DispatchApplication.class, args)){
}
}