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

Spring boot включить/отключить встроенный tomcat с профилем

Я пишу приложение загрузки Spring, которое использует один из нескольких классов @Configuration, в зависимости от того, какой @Profile установлен в файле application.properties.

В одном из этих классов конфигурации используется интерфейс REST, поэтому я включаю spring-boot-starter-web в качестве зависимости.

Это запускает встроенный экземпляр Tomcat, что отлично.

Проблема в том, что другим профилям не нужен встроенный сервер (например, я использую JMS для обработки входящих сообщений вместо REST).

Можно ли остановить запуск @SpringBootApplication от Tomcat по умолчанию и использовать его только для класса REST Configuration? Например, аннотируя этот класс с помощью @EnableWebMVC

Вот пример моих @Configuration классов:

REST:

@Profile({"REST"})
@Configuration
@EnableWebMvc
public class HttpConfiguration{
 .
 .
 .
}

JMS:

@Profile({"JMS"})
@Configuration
@EnableJms
public class JMSConfiguration{
 .
 .
 .
}

Спасибо

4b9b3361

Ответ 1

Использование

@SpringBootApplication(exclude = {EmbeddedServletContainerAutoConfiguration.class, 
                                  WebMvcAutoConfiguration.class})

чтобы исключить Spring Загрузочную автоматическую конфигурацию для встроенных контейнеров сервлетов. Кроме того, вам нужно установить следующее свойство для случаев, отличных от REST, так что Spring Boot не будет пытаться запустить WebApplicationContext (которому нужен контейнер сервлета):

spring.main.web-environment=false

Затем включите встроенный Tomcat в свой профиль REST, импортировав EmbeddedServletContainerAutoConfiguration.class (это задерживает автоконфигурацию, пока не будет загружен профиль REST:

@Profile({"REST"})
@Configuration
@Import(EmbeddedServletContainerAutoConfiguration.class)
public class HttpConfiguration {
    // ...
}

Если вы используете любые EmbeddedServletContainerCustomizer s, вам также нужно импортировать EmbeddedServletContainerCustomizerBeanPostProcessorRegistrar.class.

Ответ 2

Ответы @hzpz и @orid задают мне правильный путь.

Мне нужно было добавить

@SpringBootApplication(exclude = {EmbeddedServletContainerAutoConfiguration.class, 
WebMvcAutoConfiguration.class})

и установите:

spring.main.web-environment=false

в моем application.properties файле для случаев, отличных от Rest.

Ответ 3

Начиная с Spring Boot 2.0, только spring.main.web-application-type=none в соответствующем профиле делают свое дело.

Если вы используете multi-document application.yml с Spring Boot 2.0, добавьте этот блок и замените no-web-profile-name профилем, который не должен иметь встроенный веб-сервер:

---
spring:
  profiles: no-web-profile-name
  main:
    web-application-type: none