Spring Boot: no se puede iniciar EmbeddedWebApplicationContext debido a que falta Bean EmbeddedServletContainerFactory

Soy totalmente nuevo en Spring y comencé a hacer las guías oficiales desde este sitio: https://spring.io/guides

Me gustaría hacer esta guía: https://spring.io/guides/gs/scheduling-tasks/

Obtengo la siguiente excepción:

2014-02-14 16:25:21.614 INFO 9032 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.scheduling.annotation.SchedulingConfiguration' of type [class org.springframework.scheduling.annotation.SchedulingConfiguration$$EnhancerByCGLIB$$5b48d763] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 2014-02-14 16:25:21.638 INFO 9032 --- [ main] .clClasspathLoggingApplicationListener : Application failed to start with classpath: [file:/C:/work/Spring/SpringTutorial/target/classes/, file:/C:/work/apache-maven-3.0.3/repo/javax/servlet/javax.servlet-api/3.0.1/javax.servlet-api-3.0.1.jar, file:/C:/work/apache-maven-3.0.3/repo/org/springframework/boot/spring-boot-starter/1.0.0.RC1/spring-boot-starter-1.0.0.RC1.jar, file:/C:/work/apache-maven-3.0.3/repo/org/springframework/boot/spring-boot/1.0.0.RC1/spring-boot-1.0.0.RC1.jar, file:/C:/work/apache-maven-3.0.3/repo/org/springframework/spring-core/4.0.0.RELEASE/spring-core-4.0.0.RELEASE.jar, file:/C:/work/apache-maven-3.0.3/repo/org/springframework/spring-context/4.0.0.RELEASE/spring-context-4.0.0.RELEASE.jar, file:/C:/work/apache-maven-3.0.3/repo/org/springframework/boot/spring-boot-autoconfigure/1.0.0.RC1/spring-boot-autoconfigure-1.0.0.RC1.jar, file:/C:/work/apache-maven-3.0.3/repo/org/springframework/boot/spring-boot-starter-logging/1.0.0.RC1/spring-boot-starter-logging-1.0.0.RC1.jar, file:/C:/work/apache-maven-3.0.3/repo/org/slf4j/jcl-over-slf4j/1.7.5/jcl-over-slf4j-1.7.5.jar, file:/C:/work/apache-maven-3.0.3/repo/org/slf4j/slf4j-api/1.7.5/slf4j-api-1.7.5.jar, file:/C:/work/apache-maven-3.0.3/repo/org/slf4j/jul-to-slf4j/1.7.5/jul-to-slf4j-1.7.5.jar, file:/C:/work/apache-maven-3.0.3/repo/org/slf4j/log4j-over-slf4j/1.7.5/log4j-over-slf4j-1.7.5.jar, file:/C:/work/apache-maven-3.0.3/repo/ch/qos/logback/logback-classic/1.0.13/logback-classic-1.0.13.jar, file:/C:/work/apache-maven-3.0.3/repo/ch/qos/logback/logback-core/1.0.13/logback-core-1.0.13.jar, file:/C:/work/apache-maven-3.0.3/repo/org/springframework/boot/spring-boot-starter-web/1.0.0.RC1/spring-boot-starter-web-1.0.0.RC1.jar, file:/C:/work/apache-maven-3.0.3/repo/org/springframework/boot/spring-boot-starter-tomcat/1.0.0.RC1/spring-boot-starter-tomcat-1.0.0.RC1.jar, file:/C:/work/apache-maven-3.0.3/repo/org/apache/tomcat/embed/tomcat-embed-core/7.0.47/tomcat-embed-core-7.0.47.jar, file:/C:/work/apache-maven-3.0.3/repo/org/apache/tomcat/embed/tomcat-embed-logging-juli/7.0.47/tomcat-embed-logging-juli-7.0.47.jar, file:/C:/work/apache-maven-3.0.3/repo/org/springframework/spring-web/4.0.0.RELEASE/spring-web-4.0.0.RELEASE.jar, file:/C:/work/apache-maven-3.0.3/repo/aopalliance/aopalliance/1.0/aopalliance-1.0.jar, file:/C:/work/apache-maven-3.0.3/repo/org/springframework/spring-aop/4.0.0.RELEASE/spring-aop-4.0.0.RELEASE.jar, file:/C:/work/apache-maven-3.0.3/repo/org/springframework/spring-beans/4.0.0.RELEASE/spring-beans-4.0.0.RELEASE.jar, file:/C:/work/apache-maven-3.0.3/repo/org/springframework/spring-webmvc/4.0.0.RELEASE/spring-webmvc-4.0.0.RELEASE.jar, file:/C:/work/apache-maven-3.0.3/repo/org/springframework/spring-expression/4.0.0.RELEASE/spring-expression-4.0.0.RELEASE.jar, file:/C:/work/apache-maven-3.0.3/repo/com/fasterxml/jackson/core/jackson-databind/2.3.1/jackson-databind-2.3.1.jar, file:/C:/work/apache-maven-3.0.3/repo/com/fasterxml/jackson/core/jackson-annotations/2.3.0/jackson-annotations-2.3.0.jar, file:/C:/work/apache-maven-3.0.3/repo/com/fasterxml/jackson/core/jackson-core/2.3.1/jackson-core-2.3.1.jar, file:/C:/work/apache-maven-3.0.3/repo/commons-lang/commons-lang/2.2/commons-lang-2.2.jar] 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:140) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:476) at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:124) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:658) at org.springframework.boot.SpringApplication.run(SpringApplication.java:355) at org.springframework.boot.SpringApplication.run(SpringApplication.java:920) at org.springframework.boot.SpringApplication.run(SpringApplication.java:909) at hu.kumite.Application.main(Application.java:17) 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:190) at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:163) at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:137) ... 7 more 

La clase de inicio de la aplicación es esta:

 @ComponentScan @EnableAutoConfiguration public class Application { public static void main(String[] args) { //SpringApplication.run(Application.class, args); SpringApplication.run(ScheduledTasks.class, args); } } 

Como puede ver, el método principal contiene una línea comentada. Ya hice un tutorial, a saber, este: https://spring.io/guides/gs/consuming-rest/ Está en funcionamiento. Pero no puedo ejecutar la aplicación ScheduledTasks, que es la siguiente:

 @EnableScheduling public class ScheduledTasks { private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); @Scheduled(fixedRate = 5000) public void reportCurrentTime() { System.out.println("The time is now " + dateFormat.format(new Date())); } } 

Uso Eclipse y ejecuto el principal de Application.java como una aplicación. ¿Alguien podría ayudarme por favor?

La guía de progtwigción no es una aplicación web, ¿entonces es probable que tenga algunas cosas con moho en su pom.xml de la guía REST? Si sigues las instrucciones de cerca, debería funcionar. Otro posible problema con el código que publicó anteriormente es que su clase @EnableAutoConfiguration no se utiliza en el contexto, solo como un método principal (que puede no ser un problema para la guía de progtwigción, pero probablemente lo es para muchos otros).

Un escaneo de @SpringBootApplication muestra que incluye las siguientes anotaciones:

 @Configuration @ComponentScan @EnableAutoConfiguration 

Entonces podrías hacer esto también:

 @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(ScheduledTasks.class, args); } } 

Usa este en tu pom.xml:

  org.springframework.boot spring-boot-starter-web  

o este :

  org.springframework.boot spring-boot-starter-tomcat  

Prueba esto

 @Configuration @ComponentScan @EnableAutoConfiguration public class Application { public static void main(String[] args) { SpringApplication.run(ScheduledTasks.class, args); } } 

El error sugiere que la aplicación que está intentando ejecutar no puede instanciar una instancia de apache tomcat. Asegúrese de ejecutar la aplicación con Tomcat.

si después de verificar todas sus dependencias experimenta el mismo problema, intente agregar lo siguiente en su clase de configuración

  @Bean public EmbeddedServletContainerFactory servletContainer() { TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory(); return factory; } 

Si está utilizando una instancia externa de tomcat (especialmente para intelij), el problema podría ser que el IDE está tratando de iniciar el tomcat incrustado. En este caso, elimine lo siguiente de su pom.xml y luego configure el tomcat externo utilizando el asistente ‘Editar Configuraciones’.

   org.springframework.boot spring-boot-starter-tomcat provided  

Tenía varias clases de aplicaciones en un proyecto Spring Boot que tenía la web comenzada incluida y quería evitar que configurara un entorno web para una de ellas, así que lo configuré manualmente de la siguiente manera:

 @SpringBootApplication public class Application { public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(false).run(args); } } 

ACTUALIZACIÓN para Spring Boot 2 y superior:

 @SpringBootApplication public class Application { public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(WebApplicationType.NONE).run(args); } } 

Añadir

   org.springframework.boot spring-boot-starter-web  

si experimenta esta excepción al usar intellij e intenta iniciar la aplicación con el botón run . Intente iniciar la aplicación desde la línea de comando en su lugar. Por ejemplo, asegúrese de que está en el directorio correcto (directorio con su archivo pom) suponiendo que se trata de una aplicación mvn spring-boot:run ejecute mvn spring-boot:run esto hizo el truco para mí.

Además, también he visto este error cuando su aplicación de spring depende de otra aplicación. En este caso, tuve que iniciar la otra aplicación primero y luego ejecutar.

He tenido problemas similares cuando el método principal está en una clase diferente de la que pasó a SpringApplcation.run ()

Entonces la solución sería usar la línea que ha comentado:

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

Agregar la anotación @SpringBootApplication Antes de que la clase de inicio solucionara este problema para mí (por lo que en esencia, este mensaje de error puede significar que “no tiene una clase marcada @SpringBootApplication ningún lado, necesita al menos uno)

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

Si lo empaqueta como un único contenedor y no es una aplicación web, intente cargar el contexto de la aplicación como se indica a continuación.

 @SpringBootApplication ApplicationContext ctx = new AnnotationConfigApplicationContext(Main.class); 

O use el siguiente plugin para empacar como un solo contenedor

   org.springframework.boot spring-boot-maven-plugin    repackage     

usted puede especificar las configuraciones externas usando el siguiente comando para ejecutar

 java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties 

/ http://docs.spring.io/spring-boot/docs/current/reference/htmlboot-features-external-config.html#boot-features-external-config-application-property-files

Tenga en cuenta que si está pasando las propiedades como argumentos, entonces no incluye @PropertySource("classpath:test.properties") y anulará los parámetros.

Si lo ejecuta satisfactoriamente con la línea de comando gradle bootRun , al empaquetarlo con el gradle jar línea de gradle jar al archivo jar para ejecutarlo con la línea de comando java -jar build/libs/demo.jar , desafortunadamente falló con Exception: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean , en este caso, debe usar la tarea bootRepackage del complemento gradle spring-boot para generar un jar especial ejecutable.

  • configuración 1

    $ gradle clean bootRepackage

  • configuración 2

    $ java -jar build / libs / demo.jar

Una SpringApplication intentará crear el tipo correcto de ApplicationContext en su nombre. De forma predeterminada, se usará AnnotationConfigApplicationContext o AnnotationConfigEmbeddedWebApplicationContext , dependiendo de si está desarrollando una aplicación web o no.

El algoritmo utilizado para determinar un ‘entorno web’ es bastante simplista (basado en la presencia de unas pocas clases). Puede usar setWebEnvironment(boolean webEnvironment) si necesita anular el valor predeterminado.

También es posible tomar el control completo del tipo de ApplicationContext que se usará al llamar a setApplicationContextClass(…​) .

[Sugerencia] A menudo es conveniente llamar a setWebEnvironment(false) cuando se usa SpringApplication dentro de una prueba JUnit.

Agregar la dependencia del arrancador de arranque de resorte solucionó mi error.

  org.springframework.boot spring-boot-starter-web  

Esto es obligatorio si desea iniciar el tomcat como un servidor embebido.

compruebe que su pom.xml existe

   org.springframework.boot spring-boot-starter-tomcat  

He tenido un problema como este; por falta esta dependencia

En mi caso, agregamos la anotación @Profile recientemente para ignorar la clase TestApplication en modo de producción y la clase Application en modo de prueba.

Lamentablemente, olvidamos agregar la siguiente línea en los archivos application.properties:

 spring.profiles.active=test or spring.profiles.active=production 

Sin estas configuraciones, no se cargó ningún perfil, lo que provocó el no tan gran dicho Spring Error.

Esto debe ser causado por un problema de dependencia; en general, debe verificar la dependencia.

El problema está en esta clase:

 @ComponentScan @EnableAutoConfiguration public class Application { public static void main(String[] args) { //SpringApplication.run(Application.class, args); SpringApplication.run(ScheduledTasks.class, args); } } 

La forma correcta de iniciar su aplicación es:

 @SpringBootApplication @EnableScheduling public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }