Подтвердить что ты не робот

Как предотвратить <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
4b9b3361

Ответ 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

Отметьте эту часть документации