【问题标题】:about spring boot how to disable web environment correctly关于spring boot如何正确禁用web环境
【发布时间】:2016-09-08 07:45:55
【问题描述】:

Spring boot 非 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

这次成功了。

为什么前两种方式行不通?

【问题讨论】:

标签: spring-boot


【解决方案1】:
public static void main(String[] args) {
    SpringApplication(Application.class)
       .setWebApplicationType(WebApplicationType.NONE)
       .run(args);
}

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

【讨论】:

    【解决方案2】:

    这个答案已经过时了。请注意 Spring Boot 2.0 的另一个答案

    Spring Boot 1.x 的原始答案:

    此配置不起作用的原因是因为这是两个不同的实例:

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

    您正在禁用new SpringApplication() 对象中的setWebEnvironment(false) 并在SpringApplication.run(...) 上调用静态方法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

    并且您不需要排除以下配置:

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

    因为您的pom.xml 中没有spring-boot-starter-web 依赖项

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>    
    

    【讨论】:

    • 感谢@Sanjay Rawat 但如果只能通过setWebEnviroment(false) 禁用Web 环境,则不能通过排除某些关键类来实现此目的
    • @zhguuowei 参见方法#3。
    • 这个答案已经过时了。请注意 Spring Boot 2.0 的另一个答案
    【解决方案3】:

    从 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

    【讨论】:

    • 感谢您提供 Spring Boot 2 解决方案;我正在寻找从 Spring 1 开始的迁移。
    猜你喜欢
    • 2018-08-11
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    相关资源
    最近更新 更多