2016-07-20 2 views
1

스프링 통합으로 오류 흐름을 정의하려고합니다. http 호출을하기 전에 리소스에 대한 사용자 정의 헤더 형식으로 ID를 설정하고 있습니다.하지만이 코드는 오류 (2xx http 코드가 아닙니다)를 반환하므로 GenericTransform 클래스를 가져와 정의하고 있습니다. 오류를 확인하고 리소스의 ID도 가져옵니다 (headeR에서 추출). 하지만이게 그렇게 작동하지 않는 것 같아서 HTTP 코드가 실행되기 전에 정의 된 사용자 정의 헤더에 더 이상 액세스 할 수 없습니다.http 오류를받은 후 스프링 통합에서 사용자 정의 헤더에 액세스하는 방법

어떻게 달성 할 수 있습니까? 아래의 코드에서 사용자 정의 헤더 (messageId)를 추가 할 수 있지만 http 호출에서 실패한 http 코드가 반환 된 경우 헤더와 해당 값이 손실됩니다. 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"); 
} 

모든 아이디어가 높이 평가됩니다.

+1

'makeHttpRequest()'를 보여줘야합니다. –

답변

0

잘 작동합니다. 원래의 헤더를 통과하지 않고도 modyfinig 헤더를 사용하는 트랜스포머를 사용했기 때문에 문제가있었습니다.

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

그래서 라인 3 읽어야합니다

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

감사합니다!

관련 문제