我正在使用spring-boot
并在maven pom中添加了spring-web
依赖项,以便使用RestTemplate
。
现在spring尝试初始化EmbeddedServletContext
。我该如何预防?
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
答案 0 :(得分:30)
供参考:此用例记录在Spring Boot Reference Guide:
中并非所有Spring应用程序都必须是Web应用程序(或Web服务)。如果要在
main
方法中执行某些代码,还要引导Spring应用程序来设置要使用的基础结构,那么使用Spring Boot的SpringApplication
功能很容易。SpringApplication
根据是否认为需要Web应用程序来更改其ApplicationContext
类。您可以做的第一件事就是将servlet API依赖项从类路径中删除。如果您不能这样做(例如,您正在运行来自相同代码库的2个应用程序),那么您可以显式调用SpringApplication.setWebEnvironment(false)
,或设置applicationContextClass
属性(通过Java API或外部属性) 。您希望作为业务逻辑运行的应用程序代码可以实现为CommandLineRunner
,并作为@Bean
定义放入上下文中。
application.properties:
spring.main.web-environment=false #webEnvironment property
答案 1 :(得分:26)
第一招:
public static void main(String[] args) throws Exception {
ConfigurableApplicationContext ctx = new SpringApplicationBuilder(Application.class)
.web(false)
.run(args);
}
第二
@Configuration
@EnableAutoConfiguration(exclude = WebMvcAutoConfiguration.class)
public class Application {
答案 2 :(得分:7)
虽然禁用Web环境的传统方法(如@Tim的答案中所述)仍然适用于Spring Boot 2.x,但新的首选方法是设置以下属性
spring.main.web-application-type=none
Here是定义允许值的枚举
答案 3 :(得分:6)
这适用于Spring Boot 2.x
public static void main(String[] args) {
new SpringApplicationBuilder(MyApplication.class)
.web(WebApplicationType.NONE)
.build()
.run(args);
}
答案 4 :(得分:1)
我试图用Spring Boot 2.06构建一个Reactive Web App并收到此错误:
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
此链接说明了问题,并提出了两个建议:
我正在使用Spring Boot构建一个新的Spring WebFlux应用程序。 从start.spring.io下载项目模板后,我添加了 一些第三方依赖项,并尝试启动该应用程序。然后 我遇到了错误 org.springframework.context.ApplicationContextException:无法执行 由于缺少启动ServletWebServerApplicationContext ServletWebServerFactory bean。...
错误消息是解决方案的线索。它说无法启动 ServletWebServerApplicationContext,但是我的项目正在使用WebFlux 这是一个反应性的Web项目,而不是基于Servlet的Spring Web MVC 项目。
调试Spring源代码可以帮助我找到原因。在里面 的deruceWebApplicationType方法 org.springframework.boot.SpringApplication,Web应用程序类型 仅当Spring Web的类设置为WebApplicationType.REACTIVE时 MVC不存在于CLASSPATH中。
一旦确定了根本原因,解决方案就很容易。我们可以:
更新Maven依赖项以排除spring-webmvc或设置网站 显式将应用程序类型转换为WebApplicationType.REACTIVE 在下面。
@SpringBootApplication class MyApplication fun main(args: Array<String>) { val app = SpringApplication(MyApplication::class.java) app.webApplicationType = WebApplicationType.REACTIVE app.run(*args) }
不幸的是,这些解决方案都不适合我。相反,我改编了geoand的响应,并将其添加到我的application.properties
:
spring.main.web-application-type=reactive
Voila!问题解决了!