software - sonarqube java analysis
SonarQube "Cerrar este ConfigurableApplicationContext" en el proyecto Spring Boot (3)
Tengo un problema con el bloqueador "Cerrar este" ConfigurableApplicationContext "" en el método principal
public static void main(String[] args)
{
SpringApplication.run(MyApplication.class, args);
}
He intentado código de ejemplo de SonarQube
public static void main(String[] args)
{
ConfigurableApplicationContext context = null;
try
{
context = SpringApplication.run(MyApplication.class, args);
}
finally
{
if (context != null) {
context.close();
}
}
}
pero cierra el contexto justo después de comenzar.
¿Cómo arreglar este problema?
El problema que informa SonarQube es un falso positivo y debe ignorarse. Las preguntas frecuentes de SonarQube enumeran algunas opciones para eliminar falsos positivos:
Falso positivo y no solucionará
Puede marcar los problemas individuales como Falso positivo o No se solucionará a través de la interfaz de problemas. Sin embargo, esta solución no funciona en todas las sucursales, tendrá que volver a marcar el problema Falso Positivo para cada rama en análisis. Por lo tanto, un enfoque de código puede ser preferible si se están analizando varias ramas de un proyecto:
// NOSONAR
Puede usar el mecanismo incorporado en el motor de reglas (// NOPMD ...) o el mecanismo genérico implementado en SonarQube: poner // NOSONAR al final de la línea del problema. Esto suprimirá el problema.
Problemas de apagado
Puede revisar un problema para marcarlo como falso positivo directamente desde la interfaz de usuario.
Si tiene una aplicación web, el contexto de la aplicación será destruido (creo que por ContextLoaderListener
, no estoy seguro), no se necesita un código explícito.
En el caso de una aplicación de línea de comandos, el contexto debe destruirse manualmente, de lo contrario, los beans no se destruirán correctamente: no se llamarán los métodos @PreDestroy. P.ej:
@Bean
public ApplicationRunner applicationRunner() {
return new ApplicationRunner() {
public void run(ApplicationArguments args) throws Exception {
try {
doStuff();
} finally {
context.close();
}
}
Noté esto cuando una sesión de Cassandra permaneció abierta después de que mi aplicación de línea de comandos de inicio de primavera hubiera finalizado.
Siempre estuve pensando, que es falso / positivo.
Pero puedes probar esto con unas pocas líneas.
@RunWith(SpringRunner.class)
@SpringBootTest
public class YourApplicationTest {
@Test
public void shouldLoadApplicationContext() {
}
@Test
public void applicationTest() {
YourApplication.main(new String[] {});
}
}
¡Ahora dice Sonar, esto está probado!
(Kudos va a: Robert @ https://.com/a/41775613/863403 )