web-dev-qa-db-fra.com

Spring boot activer / désactiver Tomcat intégré avec profil

J'écris une application Spring Boot qui utilise l'un des nombreux @Configuration classes selon laquelle @Profile est défini dans le application.propertiesfichier.

L'une de ces classes de configuration utilise une interface REST, et j'inclus donc spring-boot-starter-web comme dépendance.

Cela démarre une instance Tomcat intégrée, ce qui est bien.

Le problème est que les autres profils n'ont pas besoin d'un serveur intégré (par exemple, j'utilise JMS pour gérer les messages entrants au lieu de REST).

Existe-t-il un moyen d'arrêter le @SpringBootApplication de démarrer Tomcat par défaut et de ne l'utiliser que pour la classe de configuration REST? Par exemple, en annotant cette classe avec @EnableWebMVC

Voici un exemple de mon @ConfigurationDes classes:

DU REPOS:

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

JMS:

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

Merci

21
barcom

Utilisation

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

pour exclure la configuration automatique de Spring Boot pour les conteneurs de servlet intégrés. De plus, vous devez définir la propriété suivante pour les cas non REST, afin que Spring Boot n'essaye pas de démarrer un WebApplicationContext (qui a besoin d'un conteneur de servlet):

spring.main.web-environment=false

Activez ensuite le Tomcat intégré dans votre profil REST en important EmbeddedServletContainerAutoConfiguration.class (cela retarde la configuration automatique jusqu'à ce que le profil REST ait été chargé:

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

Si vous utilisez des EmbeddedServletContainerCustomizers, vous devez également importer EmbeddedServletContainerCustomizerBeanPostProcessorRegistrar.class.

29
hzpz

Les réponses de @hzpz et @orid m'ont mis sur la bonne voie.

Je devais ajouter

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

et mettre:

spring.main.web-environment=false

dans mon application.properties fichier pour les cas non-Rest.

17
barcom

Depuis Spring Boot 2.0 uniquement spring.main.web-application-type=none dans le profil correspondant, faites l'affaire.

Si vous utilisez un multi-document application.yml avec Spring Boot 2.0, en ajoutant ce bloc et en remplaçant no-web-profile-name avec le profil qui ne devrait pas avoir de serveur Web intégré devrait fonctionner:

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