如何防止spring-web的弹簧启动自动配置?

时间:2015-04-22 14:22:50

标签: java spring spring-boot spring-web

我正在使用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

5 个答案:

答案 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

此链接说明了问题,并提出了两个建议:

  

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

     

我正在使用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!问题解决了!