2016-07-20 2 views
1

J'essaie de définir un flux d'erreur avec intégration de ressort. Avant de passer un appel http, je mets un ID sous la forme d'un en-tête personnalisé pour la ressource que je veux traiter - ceci renvoie cependant une erreur (pas un code http 2xx), donc je définis la classe GenericTransform pour sortir le erreur et prenez aussi l'id de la ressource (en extrayant cela de la tête). Mais cela ne semble pas fonctionner ainsi et je n'ai plus accès à mes en-têtes personnalisés définis avant l'exécution du code HTTP.Comment accéder aux en-têtes personnalisés dans Spring Integration après avoir reçu l'erreur http

Comment cela peut-il être réalisé? Dans le code ci-dessous, je peux ajouter un en-tête personnalisé (messageId) mais si l'appel http renvoie un code http échoué, alors je perds l'en-tête et sa valeur - cela fonctionne correctement lorsqu'une réponse réussie vient après l'appel du point final http.

@Bean 
public IntegrationFlow makeHttpCall() { 
    return message -> message 
          .enrich(e -> e 
            .requestPayload(Message::getPayload) 
            .shouldClonePayload(false) 
            .<Map<String, String>>headerFunction("messageId", m -> m.getPayload().substring(0,10), true) 
          )        
          .handle(makeHttpRequest()) 
          .transform(new GenericTransformer<Message<ResponseEntity>, Message<ResponseEntity>>() { 
           @Override 
            public Message<ResponseEntity> transform(Message<ResponseEntity> message) { 
            if (message.getHeaders().get("http_statusCode").equals("http_statusCode=200")) { 
             //This is failing, only http headers available           
             logger.debug("Response from the endpoint: " + message.getPayload());            
             return message; 
            } else { 
             String messageId = message.getHeaders().get("messageId").toString(); 
             MutableMessageHeaders headers = new MutableMessageHeaders(message.getHeaders());                       
             headers.put("error_message", "1");                      
             headers.put("messageId", messageId); 
             return new GenericMessage<ResponseEntity>(message.getPayload(), headers); 
            } 

           } 
          })       
          .channel("entrypoint"); 
} 

Toute idée très appréciée.

+1

Vous devez afficher 'makeHttpRequest()'. –

Répondre

0

Cela fonctionne très bien, le problème que j'ai été dû au fait que j'avais un transformateur qui a également été modyfinig en-têtes sans passer les originaux.

.transform(new GenericTransformer<Message<String>, Message<String>>() { 
            @Override 
            public Message<String> transform(Message<String> message) {  //incorrectly instantiated        
             MutableMessageHeaders headers = new MutableMessageHeaders(); 
             headers.put("Content-Type", "application/json"); 
             headers.put("Accept", "application/json"); 
             Message<String> request = new GenericMessage<String>(json.toString(), headers); 
             return request; 
            } 
          }) 

Ainsi, la ligne 3 devrait lire:

MutableMessageHeaders headers = new MutableMessageHeaders(message.getHeaders()); 

Merci!