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

Posted

技术标签:

【中文标题】关于spring boot如何正确禁用web环境【英文标题】:about spring boot how to disable web environment correctly 【发布时间】: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

这次成功了。

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

【问题讨论】:

发布实际代码而不是 sn-p... 您的 main 方法中有更多行。所以贴出应用类。 试试这个@SpringBootApplication(exclude = EmbeddedServletContainerAutoConfiguration.class, WebMvcAutoConfiguration.class)作为Suggested here @SanjayRawat 还是不行,请看github.com/zhugw/spring-boot-disable-web-environment @M.Deinum 请参阅github.com/zhugw/spring-boot-disable-web-environment 【参考方案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 开始的迁移。

以上是关于关于spring boot如何正确禁用web环境的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用 Spring Web MVC

Spring Boot 在本地环境中禁用 SAML 安全性

如何在模块/集成测试中禁用 Spring SQS 处理程序

在 Spring Boot 应用程序的生产环境中禁用 GraphiQL Playground

如何在 Spring Boot 中禁用 Tomcat 的 permessage-deflate WebSocket 压缩?

Spring Boot:禁用安全自动配置