Как предотвратить <autoconfiguration spring -boot для spring -web?
Я использую spring-boot
и добавил зависимость spring-web
в maven pom, чтобы использовать RestTemplate
.
Теперь spring пытается инициализировать EmbeddedServletContext
. Как я могу предотвратить это?
Exception in thread "main" org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:133)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:474)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:957)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:946)
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:183)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:156)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:130)
... 8 more
Ответы
Ответ 1
Для справки: этот пример использования описан в Spring Справочном руководстве по загрузке:
Не все приложения Spring должны быть веб-приложениями (или веб-службами). Если вы хотите выполнить некоторый код в методе main
, но также загрузите приложение Spring для настройки используемой инфраструктуры, то его легко использовать с SpringApplication
функциями Spring Boot. A SpringApplication
изменяет класс ApplicationContext
в зависимости от того, считает ли он, что ему требуется веб-приложение или нет. Первое, что вы можете сделать, чтобы помочь, - просто оставить зависимостей API сервлета от пути к классам. Если вы не можете сделать это (например, вы используете 2 приложения из одной базы кода), вы можете явно вызвать SpringApplication.setWebEnvironment(false)
или установить свойство applicationContextClass
(через API Java или внешние свойства). Код приложения, который вы хотите использовать в качестве бизнес-логики, может быть реализован как CommandLineRunner
и помещен в контекст как определение @Bean
.
application.properties:
spring.main.web-environment=false #webEnvironment property
Ответ 2
Первый трюк:
public static void main(String[] args) throws Exception {
ConfigurableApplicationContext ctx = new SpringApplicationBuilder(Application.class)
.web(false)
.run(args);
}
Во-вторых:
@Configuration
@EnableAutoConfiguration(exclude = WebMvcAutoConfiguration.class)
public class Application {
Ответ 3
Хотя устаревший способ отключения веб-среды (как указано в ответе @Tim) по-прежнему работает в Spring Boot 2.x, однако новый предпочтительный способ заключается в установке следующего свойства
spring.main.web-application-type=none
Отметьте эту часть документации