SonarQube "fermer ce Contextd'application configurable" dans le projet de démarrage de printemps

J'ai un problème de bloqueur "fermer ce" context configurable D'application "" dans la méthode principale

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

j'ai essayé le code de SonarQube exemple

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

mais il ferme le contexte immédiatement après le démarrage.

Comment résoudre ce problème?

20
demandé sur kimreik 2016-05-06 14:17:14

3 réponses

La question que SonarQube est de reporting est un faux positif et doit être ignorée. FAQ de SonarQube liste quelques options pour supprimer les faux positifs:

Faux-Positifs et ne sera pas Corrigé

vous pouvez marquer des problèmes individuels comme étant faux positifs ou ne corrigera pas par l'intermédiaire de l'interface des problèmes. Toutefois, cette solution ne fonctionne pas dans toutes les directions générales - vous devrez marquer de nouveau la question faussement Positive pour chaque direction générale faisant l'objet d'une analyse. Donc une approche en code peut être préférable si plusieurs branches d'un projet sont en cours d'analyse:

/ / NOSONAR

vous pouvez utiliser le mécanisme intégré dans le moteur de règles (//NOPMD...) ou le mécanisme Générique mis en œuvre dans SonarQube: mettre //NOSONAR à la fin de la ligne de la question. Cela supprimera le problème.

Désactiver Les Problèmes

vous pouvez examiner un problème pour le signaler comme faux positif directement depuis l'interface utilisateur.

24
répondu Andy Wilkinson 2016-05-06 13:02:47

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

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

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

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

j'ai remarqué cela quand une session de Cassandra est restée ouverte après que mon application en ligne de commande de démarrage de printemps soit terminée.

1
répondu Assen Kolov 2017-01-23 17:39:40

je suis toujours en train de penser, qu'il est faux positif.

mais vous pouvez tester ceci avec quelques lignes.

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

    @Test
    public void shouldLoadApplicationContext() {
    }

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

}

maintenant Sonar dit, Ceci est testé!

(Félicitations à: Robert @ https://stackoverflow.com/a/41775613/863403)

0
répondu Joerg 2017-07-28 13:36:45