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

新手上路,请多包涵

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

这次它起作用了。

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

原文由 zhuguowei 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

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

Spring Boot 1.x 的原始答案:

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

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

You are disabling setWebEnvironment(false) in new SpringApplication() object and calling static method run() on SpringApplication.run(...) which is different one.

我想出了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 ;)");
    }
}

这是完整的工作 项目

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

 @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>

原文由 Sanjay Rawat 发布,翻译遵循 CC BY-SA 4.0 许可协议

从 Spring Boot 2.0 开始

-web(false)/setWebEnvironment(false) 已弃用,而是可以使用 Web-Application-Type 来指定

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

   @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 服务器。

礼貌: 另一个 SO 答案

原文由 Narasimha 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
logo
Stack Overflow 翻译
子站问答
访问
宣传栏