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?
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.
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.
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 )