2016-07-20 5 views
1

zugreifen Ich versuche, einen Fehlerfluss mit Feder Integration zu definieren. Bevor ich einen HTTP-Aufruf mache, setze ich eine ID in Form eines benutzerdefinierten Headers für die Ressource, die ich verarbeiten möchte - dies gibt jedoch einen Fehler (nicht 2xx http-Code) zurück, also definiere ich die GenericTransform-Klasse, um die zu entfernen Fehler und nimm auch die ID der Ressource (entziehe das vom headerR). Aber das scheint nicht so zu funktionieren und ich habe keinen Zugriff mehr auf meine benutzerdefinierten Header, die vor der Ausführung des HTTP-Codes definiert wurden.Wie auf benutzerdefinierte Header in Spring-Integration nach dem Empfang http-Fehler

Wie kann dies erreicht werden? Im folgenden Code kann ich einen benutzerdefinierten Header (messageId) hinzufügen, aber wenn der http-Aufruf einen erfolglosen http-Code zurückgibt, dann verliere ich den Header und seinen Wert - das funktioniert gut, wenn eine erfolgreiche Antwort nach dem Aufruf des http-Endpunkts kommt.

@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"); 
} 

Alle Ideen sehr geschätzt.

+1

Sie müssen 'makeHttpRequest()' anzeigen. –

Antwort

0

Das funktioniert gut, das Problem war ich aufgrund der Tatsache, dass ich einen Transformator hatte, der auch modyfinig Header ohne Passieren der ursprünglichen waren.

.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; 
            } 
          }) 

die Linie 3 sollte also lauten:

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

Dank!

Verwandte Themen