tutorial mvc gratis framework example español ejemplo curso java spring spring-boot spring-web

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:

https://vividcode.io/Fixing-Spring-Boot-error-Unable-to-start-ServletWebServerApplicationContext-due-to-missing-ServletWebServerFactory-bean/

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ísticas SpringApplication de Spring Boot. Un SpringApplication cambia su clase ApplicationContext 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 a SpringApplication.setWebEnvironment(false) , o configurar la propiedad applicationContextClass (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 un CommandLineRunner 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 {