[JAVA] Comment appliquer HandlerInterceptor à la passerelle entrante http de Spring Integration

Je joue avec Spring Integration au travail en ce moment, et j'utilise un gestionnaire défini par Bean (HttpRequestHandlingMessagingGateway) en utilisant Http.inboundGateway (Java DSL) ou <http-int: inbound-gateway> (espace de noms XML). J'étais un peu troublé parce que je ne pouvais pas appliquer HandlerInterceptor de Spring MVC à), mais j'ai découvert comment l'appliquer après avoir suivi la source de ʻIntegrationRequestMappingHandlerMapping`.

Dans Spring Integration

Exemple de définition de bean d'un gestionnaire utilisant JavaDSL


@Bean
public IntegrationFlow greetingInboundGatewayFlow(MessageChannel httpInboundChannel) {
  return IntegrationFlows.from(Http.inboundGateway("/greeting")
      .requestMapping(mapping -> mapping.methods(HttpMethod.GET))
      .requestChannel(httpInboundChannel)
  ).get();
}

Exemple de définition de bean d'un gestionnaire utilisant un espace de noms XML


<http-int:inbound-gateway
    path="/greeting" supported-methods="GET"
    request-channel="httpRequestChannel"/>

En définissant un bean tel que

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/greeting")
@RestController
public class GreetingRestController {
  @GetMapping
  public String greeting() {
    // ...
    return responseMessage;
  }
}

Vous pouvez publier le même point de terminaison que lorsque vous avez créé le contrôleur.

Avec un Spring MVC normal (Handler basé sur @ RequestMapping) ...

Si vous avez un style qui implémente la méthode @ RequestMapping dans la classe Controller, vous pouvez appliquer le HandlerInterceptor en définissant le Bean suivant.

Exemple de définition de bean par JavaConfig


@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MessageLoggingHandlerInterceptor())
                .addPathPatterns("/**") //Chemin applicable(modèle)Spécifier
                .excludePathPatterns("/static/**"); //Chemins à exclure(modèle)Spécifier
    }
}

Exemple de définition de bean par XML


<mvc:interceptors>
  <mvc:interceptor>
    <mvc:mapping path="/**"/>
    <mvc:exclude-mapping path="/static/**"/>
    <bean class="com.example.MessageLoggingHandlerInterceptor"/>
  </mvc:interceptor>
</mvc:interceptors>

Avec la passerelle entrante http de Spring Integration ...

Les gestionnaires définis à l'aide de la passerelle entrante HTTP Spring Integration gèrent les mappages de demandes séparément des MVC Spring standard. Plus précisément, le mappage des requêtes est géré dans un bean créé à partir d'une classe appelée ʻIntegrationRequestMappingHandlerMapping, et celui géré dans le bean de ʻIntegrationRequestMappingHandlerMapping est appliqué à HandlerInterceptor.

Pour appliquer HandlerInterceptor à la passerelle entrante http de Spring Integration ...

ʻIntegrationRequestMappingHandlerMapping (pour être exact, ʻAbstractHandlerMapping, qui est la classe parente de ʻIntegrationRequestMappingHandlerMapping) aHandlerInterceptor(pour être exact,HandlerInterceptor et" Apply path "et" Exclude path "holding MappedInterceptor. ) Est automatiquement détecté, il vous suffit donc de définir le Bean pour HandlerInterceptor.

Exemple de définition de bean par JavaConfig


@Bean
public MappedInterceptor customHandlerInterceptor() {
  return new MappedInterceptor(
      new String[]{"/**"},
      new String[]{"/static/**"},
      new MessageLoggingHandlerInterceptor());
}

Exemple de définition de bean par XML


<bean class="org.springframework.web.servlet.handler.MappedInterceptor">
  <constructor-arg name="includePatterns" value="/**"/>
  <constructor-arg name="excludePatterns" value="/static/**"/>
  <constructor-arg name="interceptor">
    <bean class="com.example.MessageLoggingHandlerInterceptor"/>
  </constructor-arg>
</bean>

Cependant ... Si vous avez besoin de définir plusieurs HanderInterceptor et de contrôler l'ordre des applications, il n'y a aucune garantie que l'ordre de définition du bean = ordre de l'application, définissez donc le Bean de ʻIntegrationRequestMappingHandlerMapping et explicitement HanderInterceptor Vous devez spécifier `.

Définition du bean par JavaConfig


@Bean
public IntegrationRequestMappingHandlerMapping integrationRequestMappingHandlerMapping() { //Le nom du bean doit être integrationRequestMappingHandlerMapping
  IntegrationRequestMappingHandlerMapping mapping = new IntegrationRequestMappingHandlerMapping();
  mapping.setOrder(0); //l'ordre doit être égal à 0
  mapping.setInterceptors( //Ajouter un intercepteur mappé dans l'ordre dans lequel vous souhaitez appliquer
      new MappedInterceptor(new String[] {"/**"}, new String[] {"/static/**"},
          new CustomHandlerInterceptor()),
      new MappedInterceptor(new String[] {"/**"}, new String[] {"/static/**"},
          new MessageLoggingHandlerInterceptor()));
  return mapping;
}

Exemple de définition de bean par XML


<bean id="integrationRequestMappingHandlerMapping"
      class="org.springframework.integration.http.inbound.IntegrationRequestMappingHandlerMapping">
  <property name="order" value="0"/>
  <property name="interceptors">
    <array>
      <bean class="org.springframework.web.servlet.handler.MappedInterceptor">
        <constructor-arg name="includePatterns" value="/**"/>
        <constructor-arg name="excludePatterns" value="/static/**"/>
        <constructor-arg name="interceptor">
          <bean class="com.example.CustomHandlerInterceptor"/>
        </constructor-arg>
      </bean>
      <bean class="org.springframework.web.servlet.handler.MappedInterceptor">
        <constructor-arg name="includePatterns" value="/**"/>
        <constructor-arg name="excludePatterns" value="/static/**"/>
        <constructor-arg name="interceptor">
          <bean class="com.example.MessageLoggingHandlerInterceptor"/>
        </constructor-arg>
      </bean>
    </array>
  </property>
</bean>

Résumé

Si vous souhaitez publier un point de terminaison pour HTTP, vous pouvez créer un contrôleur normalement! !! Cependant, comme il est nécessaire de prendre en charge des protocoles autres que HTTP dans le projet sur lequel je travaille actuellement, j'essaie de faire correspondre l'architecture de la coopération inter-système à l'aide de Spring Integration. Fondamentalement, je pense faire un traitement commun dans le monde de Spring Integration, mais certains traitements (sortie du journal de communication, etc.) semblent devoir être effectués avant d'entrer dans le monde de Spring Integration, donc HandlerInterceptor J'ai l'impression de l'avoir essayé.

Recommended Posts

Comment appliquer HandlerInterceptor à la passerelle entrante http de Spring Integration
Comment accéder directement à Socket avec la fonction TCP de Spring Integration
Comment utiliser CommandLineRunner dans Spring Batch of Spring Boot
Comment démarrer par environnement avec Spring Boot de Maven
Comment utiliser Lombok au printemps
Remarques sur l'utilisation de Spring Data JDBC
[Comment installer Spring Data Jpa]
Comment configurer Spring Boot + PostgreSQL
Comment utiliser setDefaultCloseOperation () de JFrame
Comment utiliser ModelMapper (Spring boot)
Comment réaliser un téléchargement de fichiers volumineux avec Rest Template of Spring
Comment appliquer immédiatement les modifications de Thymeleaf au navigateur avec #Spring Boot + maven
[Spring Boot] J'ai étudié comment implémenter le post-traitement de la demande reçue.
Comment lire le corps de la requête plusieurs fois avec Spring Boot + Spring Security
Comment vérifier avant d'envoyer un message au serveur avec Spring Integration
Comment nommer les variables 7 sélections d'inconfort
[java] Résumé de la gestion des caractères
Comment inclure Spring Tool dans Eclipse 4.6.3?
Résumé de l'écriture des arguments d'annotation
Sortie de l'en-tête HTTP de google-http-client à journaliser
Comment déterminer le nombre de parallèles
Résumé de la participation au JJUG CCC 2019 Spring
[Java] [Maven3] Résumé de l'utilisation de Maven3
Comment trier une liste de SelectItems
[Spring MVC] Comment transmettre des variables de chemin
Comment écrire un spécificateur de coupe de point Spring AOP
Comment diviser un fichier de message Spring Boot
Comment vérifier la dernière version de io.spring.platform pour l'écriture dans pom.xml de Spring (STS)
Comment définir des variables d'environnement dans le fichier de propriétés de l'application Spring Boot
Promesse JDBC et exemple d'écriture
Comment trouver la cause de l'erreur Ruby
[java] Résumé de la gestion des chaînes de caractères
Résumé de la création de balises JSF personnalisées
Personnalisez la répartition du contenu de Recyclerview
Comment utiliser MyBatis2 (iBatis) avec Spring Boot 1.4 (Spring 4)
[Bcrypt] Comment annuler la présence: true de has_secure_password
[Java] Résumé de la façon d'omettre les expressions lambda
Comprendre comment partager des connexions Spring DB (transactions DB)
Comment utiliser h2db intégré avec Spring Boot
Comment réduire l'image de Spring Boot Docker
Comment utiliser les attributs de session Spring Boot (@SessionAttributes)
L'histoire de la montée de la série Spring Boot 1.5 à la série 2.1
Comment obtenir le jour d'aujourd'hui
Sortie de la façon d'utiliser la méthode slice
Comment ajouter un chemin de classe dans Spring Boot
[Swift UI] Comment désactiver ScrollsToTop de ScrollView
Comment utiliser JQuery dans Rails 6 js.erb
Comment se lier avec un fichier de propriétés dans Spring Boot
Comment afficher le résultat du remplissage du formulaire
Appliquer Twitter Bootstrap 4 à Spring Boot 2 à l'aide de Webjars
Comment définir plusieurs orm.xml dans Spring4, JPA2.1
Comment spécifier l'index de JavaScript pour l'instruction
[Spring Boot] Comment se référer au fichier de propriétés
Spring Boot - Comment définir le délai d'expiration de la session
Comment demander en passant un tableau à une requête avec le client HTTP de Ruby