Ma classe SpringBootLoginController renvoie cette erreur (impossible de démarrer le conteneur incorporé), comme indiqué ci-dessous lorsque j'ai lancé l'application springboot. Il s'agit d'un exemple d'application d'amorçage printanier kind kind world.
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.5.2.RELEASE)
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:137) ~[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.Java:536) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.Java:122) ~[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.Java:737) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.Java:370) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.Java:314) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.Java:1162) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.Java:1151) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]
Mon pom.xml
<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test.springboot</groupId>
<artifactId>HelloSpringBoot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>HelloSpringBoot</name>
<description>HelloSpringBoot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
</parent>
<properties>
<Java.version>1.8</Java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
Mon contrôleur:
import org.springframework.boot.*;
import org.springframework.web.bind.annotation.*;
@RestController
public class SpringBootLoginController {
@RequestMapping("/hello")
String hello() {
return "Hello World!!!";
}
public static void main(String[] args) throws Exception {
SpringApplication.run(SpringBootLoginController.class, args);
}
}
En annotant avec @SpringBootApplication, vous résolvez ce problème.
@SpringBootApplication
@RestController
public class SpringBootLoginController {
@RequestMapping("/hello")
String hello() {
return "Hello World!!!";
}
public static void main(String[] args) throws Exception {
SpringApplication.run(SpringBootLoginController.class, args);
}
}
Vous pouvez également ajouter @EnableAutoConfiguration pour résoudre ce problème.
@EnableAutoConfiguration
@RestController
public class SpringBootLoginController {
@RequestMapping("/hello")
String hello() {
return "Hello World!!!";
}
public static void main(String[] args) throws Exception {
SpringApplication.run(SpringBootLoginController.class, args);
}
}
Essayez d’annoter votre classe SpringBootLoginController
avec une annotation @SpringBootApplication
.
@SpringBootApplication
@RestController
public class SpringBootLoginController {
@RequestMapping("/hello")
String hello() {
return "Hello World!!!";
}
public static void main(String[] args) throws Exception {
SpringApplication.run(SpringBootLoginController.class, args);
}
}
Pour mon cas, je développais un projet de ligne de commande avec springboot.
@SpringBootApplication
public class Application implements CommandLineRunner {
//my code here
}
J'utilisais donc simplement le démarreur simple.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
Mais j'ai aussi eu cette erreur, et il n'y avait pas de dépendance liée au Web dans mon pom qui était vraiment câblée.
Et enfin, j'ai découvert qu'un de mes projets de dépendance utilisait le "javax.servlet.Servlet" dans son propre pom.
Si vous vérifiez le code source du springboot, il vérifiera s'il y a du "javax.servlet.Servlet" dans votre projet lors du démarrage de l'application. Et essayez de démarrer un "conteneur incorporé" Web lorsqu'il existe un "javax.servlet.Servlet".
C'est pourquoi j'ai eu cette erreur parce que j'utilisais le "démarreur à ressort" et qu'il n'y avait aucun conteneur Web à l'intérieur.
Donc, la solution est très simple, dites simplement à springboot qu'il ne s'agit pas d'un projet Web dans le fichier "application.properties":
spring.main.web-environment=false
dans mon cas, en ajoutant
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
problème résolu
Si vous utilisez maven, construisez par
mvn package
au lieu de IDE construire un fichier jar.
Il y a beaucoup de problèmes avec le jar construit IDE dans mon cas.
Vous devriez annoter votre classe SpringBootLoginController
. Lisez à propos de l'annotation @SpringBootApplication
.
@SpringBootApplication
@RestController
public class SpringBootLoginController {
@RequestMapping("/hello")
String hello() {
return "Hello World!!!";
}
public static void main(String[] args) throws Exception {
SpringApplication.run(SpringBootLoginController.class, args);
}
}