web-dev-qa-db-fra.com

SonarQube "Fermer ce ConfigurableApplicationContext" dans le projet Spring Boot

J'ai un problème de bloqueur "Fermer ce" ConfigurableApplicationContext "" dans la méthode principale

public static void main(String[] args)
{
    SpringApplication.run(MyApplication.class, args);
}

J'ai essayé le code de l'exemple SonarQube

public static void main(String[] args)
{
    ConfigurableApplicationContext context = null;
    try
    {
        context = SpringApplication.run(MyApplication.class, args);
    }
    finally
    {
        if (context != null) {
            context.close();
        }
    }
}

mais cela ferme le contexte juste après le démarrage.

Comment résoudre ce problème?

20
kimreik

Le problème signalé par SonarQube est un faux positif et doit être ignoré. FAQ de SonarQube répertorie quelques options pour supprimer les faux positifs:

Faux positif et ne sera pas réparé

Vous pouvez marquer des problèmes individuels comme faux positifs ou non résolus via l'interface des problèmes. Cependant, cette solution ne fonctionne pas dans toutes les branches - vous devrez marquer à nouveau le problème Faux positif pour chaque branche analysée. Une approche en code peut donc être préférable si plusieurs branches d'un projet sont en cours d'analyse:

// NOSONAR

Vous pouvez utiliser le mécanisme incorporé dans le moteur de règles (// NOPMD ...) ou le mécanisme générique implémenté dans SonarQube: mettez // NOSONAR à la fin de la ligne du problème. Cela supprimera le problème.

Problèmes d'arrêt

Vous pouvez examiner un problème pour le signaler comme faux positif directement à partir de l'interface utilisateur.

24
Andy Wilkinson

Si vous avez une application Web, le contexte de l'application sera détruit (je pense que par ContextLoaderListener, je ne suis pas sûr), aucun code explicite n'est nécessaire. 

Dans le cas d'une application en ligne de commande, le contexte doit être détruit manuellement, sinon les beans ne seront pas détruits correctement - les méthodes @PreDestroy ne seront pas appelées. Par exemple:

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

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

J'ai remarqué cela lorsqu'une session Cassandra est restée ouverte après la fin de mon application de ligne de commande de démarrage printanier. 

1
Assen Kolov

Je pensais toujours que c'était faux/positif.

Mais vous pouvez tester cela avec quelques lignes.

@RunWith(SpringRunner.class)
@SpringBootTest
public class YourApplicationTest {

    @Test
    public void shouldLoadApplicationContext() {
    }

    @Test
    public void applicationTest() {
        YourApplication.main(new String[] {});
    }

}

Maintenant, dit Sonar, c'est testé!
(Merci à Robert @ https://stackoverflow.com/a/41775613/863403 )

1
Joerg