Подтвердить что ты не робот

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

но он закрывает контекст сразу после запуска.

Как исправить эту проблему?

4b9b3361

Ответ 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)){
    }
}