2016-07-20 7 views
1

私はスプリング統合でエラーフローを定義しようとしています。私はhttp呼び出しを行う前に、私が処理したいリソースのカスタムヘッダーの形でIDを設定していますが、これはエラー(2xxのhttpコードではありません)を返します。したがって、GenericTransformクラスを定義してエラーを返し、リソースのIDも取得します(headeRから抽出​​します)。しかし、これはそのようには動作していないようで、HTTPコードが実行される前に定義されたカスタムヘッダにアクセスすることはできません。httpエラーを受け取った後にSpringインテグレーションのカスタムヘッダにアクセスする方法

これはどのように達成できますか?下のコードでは、カスタムヘッダー(messageId)を追加できますが、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

これはうまくいきます。問題は、元のものを渡さずにヘッダーも変更しているトランスフォーマーがあったためです。

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

感謝を!

関連する問題