2017-03-06 8 views
1

"routingkey"メッセージヘッダーを必要とするバネ統合フローがあります。これが存在しない場合は、HTTP 400の応答をクライアントに送り返したいと思います。どうやってやるの?以下は、decideRoutingKeyメソッドがルーティングキーがヘッダーとして渡されたかどうかを判断できるところです。Spring統合フローがHTTP 400で応答する

@Bean 
public IntegrationFlow webToRabbit(RabbitTemplate amqpTemplate) 
{ 
    return IntegrationFlows 
      .from 
      (
       Http.inboundGateway("/tunnel") 
        .replyTimeout(Integer.valueOf(timeout)) 
        .mappedRequestHeaders("*") 
        .mappedResponseHeaders("*") 
      ) 
      .log() 
      .handle 
      (
       Amqp.outboundGateway(amqpTemplate) 
        .exchangeName(exchangeName) 
        .routingKeyFunction(f->determineRoutingKey(f)) 
        .mappedRequestHeaders("*") 
        .mappedReplyHeaders("*") 
      ) 
      .log() 
      .bridge(null) 
      .get(); 
} 

private String determineRoutingKey(Message<?> message) 
{ 
    MessageHeaders headers = message.getHeaders(); 
    if(headers.containsKey(HEADER_ROUTINGKEY)) 
    { 
     String routingKey = Objects.toString(headers.get(HEADER_ROUTINGKEY)); 
     log.debug("Using routing key: " + routingKey); 
     return routingKey; 
    } 
    else 
    { 
     log.error("Headers found: " + Objects.toString(headers)); 

     //Here I get an exception stating that MessageHeaaders is immutable 
     message.getHeaders().put(HttpHeaders.STATUS_CODE, HttpStatus.BAD_REQUEST); 
     return null; 
    } 
} 

ご協力いただきありがとうございます。何が必要そう

private HttpStatus resolveHttpStatusFromHeaders(MessageHeaders headers) { 
    Object httpStatusFromHeader = headers.get(org.springframework.integration.http.HttpHeaders.STATUS_CODE); 
    return buildHttpStatus(httpStatusFromHeader); 
} 

、普通のです(エラーメッセージの文字列?)回答とhttp_statusCodeヘッダなどの適切なHttpStatus.BAD_REQUEST

答えて

0

があるようなロジックがあります。

例外はありません。

UPDATE

あなたは流れの真ん中にあり、それは遠く回答からまだあるので、あなたはその例外的なアプローチに固執することができます。

Http.inboundGateway("/tunnel") 
    .errorChannel("httpErrorFlow.input") 
... 

@Bean 
public IntegrationFlow httpErrorFlow() { 
    return f -> f 
      .<RuntimeException, Message<?>>transform(payload -> { 
       if (payload.getCause() instanceof MyRoutingKeyException) { 
        return MessageBuilder.withPayload("Bad routing key") 
          .setHeader(HttpHeaders.STATUS_CODE, HttpStatus.BAD_REQUEST) 
          .build(); 
       } 
       throw payload; 
      }); 
} 

しかし、再び:

は何が適切な400応答を返すためにそこにしなければならないことはHttp.inboundGateway()errorChannel戻りにいくつかの簡単な変圧器の適切なHttpHeaders.STATUS_CODEヘッダとMessageであるあなたがすることはできませんだけで例外をスローします。

です。

+0

私はあなたの答えを理解できません。 –

+0

'HttpRequestHandlingEndpointSupport'は、ヘッダからステータスコードを適切に解決し、応答の本体として応答' payload'を使用できます。例外をスローする必要はありません。それ以外の場合は、「500」だけです。手動で返信を設定し、その間違ったケースで返信メッセージに 'HttpHeaders.STATUS_CODE'を追加する必要があります。 –

+0

例外をスローすることができますが、 'Http.inboundGateway()'に 'errorChannel'を追加して、' HttpStatus.BAD_REQUEST'値の 'HttpHeaders.STATUS_CODE'ヘッダーを持つ適切な応答にその例外を変換する必要があります。 –

関連する問題