关于spring boot如何正确禁用web环境

时间:2016-05-12 12:53:22

标签: spring-boot

Spring启动非Web应用程序,启动时出现以下错误

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:185) ~[spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]

然后我尝试了以下方式

new SpringApplication().setWebEnvironment(false);

然后开始它还有上面的错误。

然后尝试了

@SpringBootApplication(exclude={SpringDataWebAutoConfiguration.class})

但仍然有同样的错误。

最后,我尝试在application.properties

中添加以下配置
spring.main.web-environment=false

这次它有效。

为什么前两种方式不起作用?

3 个答案:

答案 0 :(得分:18)

从Spring Boot 2.0开始

-web(false)/ setWebEnvironment(false)已弃用,而Web-Application-Type可用于指定

  • Application Properties

    spring.main.web-application-type=NONE 
    # REACTIVE, SERVLET
    
  • SpringApplicationBuilder

    @SpringBootApplication
    public class SpringBootDisableWebEnvironmentApplication {
    
        public static void main(String[] args) {
            new SpringApplicationBuilder(SpringBootDisableWebEnvironmentApplication.class)
                .web(WebApplicationType.NONE) // .REACTIVE, .SERVLET
                .run(args);
       }
    }
    

WebApplicationType

  
      
  • NONE - 应用程序不应作为Web应用程序运行,也不应启动嵌入式Web服务器。
  •   
  • REACTIVE - 应用程序应作为响应式Web应用程序运行,并应启动嵌入式响应式Web服务器。
  •   
  • SERVLET - 应用程序应作为基于servlet的Web应用程序运行,并应启动嵌入式servlet Web服务器。
  •   

礼貌:Another SO Answer

答案 1 :(得分:5)

此配置无效的原因是因为这是两个不同的实例:

new SpringApplication().setWebEnvironment(false); 
SpringApplication.run(SpringBootDisableWebEnvironmentApplication.class, args);

您正在setWebEnvironment(false)对象中停用new SpringApplication()并在run()上调用静态方法SpringApplication.run(...)

我想出了3种方法:

@SpringBootApplication
public class SpringBootDisableWebEnvironmentApplication implements CommandLineRunner{


    public static void main(String[] args) throws Exception {

//      Method#1: Using SpringApplicationBuilder.

        SpringApplication springApplication = 
                new SpringApplicationBuilder()
                .sources(SpringBootDisableWebEnvironmentApplication.class)
                .web(false)
                .build();

        springApplication.run(args);

//--------------------------------------------------------      

//      Method#2: Using SpringBootDisableWebEnvironmentApplication.     

//      SpringBootDisableWebEnvironmentApplication springBootDisableWebEnvironmentApplication = 
//              new SpringBootDisableWebEnvironmentApplication();
//      springBootDisableWebEnvironmentApplication.run(args);

//--------------------------------------------------------      

//      Method#3: Using SpringApplication().

//      SpringApplication springApplication = new SpringApplication();
//      springApplication.setWebEnvironment(false);
//      
//      Set<Object> sources = new HashSet<>();
//      sources.add(SpringBootDisableWebEnvironmentApplication.class);
//      springApplication.setSources(sources);
//      springApplication.run(args);

//--------------------------------------------------------  

    }

    @Override
    public void run(String... arg0) throws Exception {
        System.out.println("Hello, Spring Boot gives many options ;)");
    }
}

以下是完整的Project

您无需在config下面排除:

@SpringBootApplication(exclude = {EmbeddedServletContainerAutoConfiguration.class, 
                              WebMvcAutoConfiguration.class})

因为您的spring-boot-starter-web

中没有pom.xml依赖项
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>    

答案 2 :(得分:0)

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

是另一种方式,而不是使用 SpringApplicationBuilder