java - mvc - spring netbeans 8
¿Cómo prevenir la autoconfiguración de arranque por resorte para web-spring? (5)
Aunque la forma tradicional de deshabilitar el entorno web (como se menciona en la respuesta de @ Tim) todavía funciona en Spring Boot 2.x, sin embargo, la nueva forma preferida es mediante la configuración de la siguiente propiedad
spring.main.web-application-type=none
Here está la enumeración que define los valores permitidos.
Estoy usando spring-boot
y spring-web
dependencia de spring-web
agregada en Maven Pom, para hacer uso de RestTemplate
.
Ahora la primavera intenta inicializar un EmbeddedServletContext
. ¿Cómo puedo prevenirlo?
Exception in thread "main" org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:133)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:474)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:957)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:946)
Caused by: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getEmbeddedServletContainerFactory(EmbeddedWebApplicationContext.java:183)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:156)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:130)
... 8 more
Estaba intentando construir una aplicación web reactiva con Spring Boot 2.06 y obtuve este error:
org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.context.ApplicationContextException: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:155) ~[spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) ~[spring-context-5.0.10.RELEASE.jar:5.0.10.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140) ~[spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:386) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1242) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1230) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
at com.vogella.springboot2.Test3Application.main(Test3Application.java:10) [main/:na]
Caused by: org.springframework.context.ApplicationContextException: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.getWebServerFactory(ServletWebServerApplicationContext.java:204) ~[spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:178) ~[spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:152) ~[spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
... 8 common frames omitted
Este enlace explica el problema y ofrece dos sugerencias:
Estaba construyendo una nueva aplicación Spring WebFlux con Spring Boot. Después de descargar la plantilla de proyecto de start.spring.io, agregué algunas dependencias de terceros e intenté iniciar la aplicación. Luego encontré el error org.springframework.context.ApplicationContextException: no se puede iniciar ServletWebServerApplicationContext debido a la falta del bean ServletWebServerFactory ...
El mensaje de error es la clave de la solución. Dice No se puede iniciar ServletWebServerApplicationContext, pero mi proyecto usa WebFlux y es un proyecto web reactivo, no un proyecto Spring Web MVC basado en servlet.
Depurar el código fuente de Spring me ayudó a encontrar la causa. En el método deduceWebApplicationType de org.springframework.boot.SpringApplication, el tipo de aplicación web se establece en WebApplicationType.REACTIVE solo cuando las clases de Spring Web MVC no están presentes en CLASSPATH.
La solución es fácil una vez que se identifica la causa raíz. Podemos:
Actualice las dependencias de Maven para excluir spring-webmvc, o establezca el tipo de aplicación web en WebApplicationType.REACTIVE explícitamente, como se muestra a continuación.
@SpringBootApplication class MyApplication fun main(args: Array<String>) { val app = SpringApplication(MyApplication::class.java) app.webApplicationType = WebApplicationType.REACTIVE app.run(*args) }
Desafortunadamente, ninguna de estas soluciones funcionó para mí. En su lugar, adapté la respuesta de Geoand y agregué esto a mi application.properties
:
spring.main.web-application-type=reactive
Voila! ¡Problema resuelto!
Esto funciona en Spring Boot 2.x
public static void main(String[] args) {
new SpringApplicationBuilder(MyApplication.class)
.web(WebApplicationType.NONE)
.build()
.run(args);
}
Para referencia: este caso de uso se documenta en la Guía de referencia de Spring Boot :
No todas las aplicaciones de Spring tienen que ser aplicaciones web (o servicios web). Si desea ejecutar algo de código en un método
main
, pero también reiniciar una aplicación Spring para configurar la infraestructura a usar, entonces es fácil con las característicasSpringApplication
de Spring Boot. UnSpringApplication
cambia su claseApplicationContext
dependiendo de si cree que necesita una aplicación web o no. Lo primero que puede hacer para ayudarlo es simplemente dejar las dependencias de la API del servlet fuera de la ruta de clase. Si no puede hacerlo (por ejemplo, está ejecutando 2 aplicaciones desde el mismo código base), puede llamar explícitamente aSpringApplication.setWebEnvironment(false)
, o configurar la propiedadapplicationContextClass
(a través de la API de Java o con propiedades externas). El código de la aplicación que desea ejecutar como lógica empresarial puede implementarse como unCommandLineRunner
y@Bean
en el contexto como una definición de@Bean
.
application.properties:
spring.main.web-environment=false #webEnvironment property
Primer truco
public static void main(String[] args) throws Exception {
ConfigurableApplicationContext ctx = new SpringApplicationBuilder(Application.class)
.web(false)
.run(args);
}
Segundo:
@Configuration
@EnableAutoConfiguration(exclude = WebMvcAutoConfiguration.class)
public class Application {