关于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 Boot 应用程序的生产环境中禁用 GraphiQL Playground
如何在 Spring Boot 中禁用 Tomcat 的 permessage-deflate WebSocket 压缩?