2017-03-06 77 views
1

我有一個彈簧集成流程,需要一個「路由鍵」消息頭。如果不存在,我想發送一個HTTP 400響應給客戶端。我怎樣才能做到這一點?下面你會看到判斷路由密鑰方法,我可以確定路由密鑰是否作爲頭傳遞。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; 
    } 
} 

在此先感謝您的幫助。

回答

0

有類似的邏輯:

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

所以,你需要的是隻需定期(字符串錯誤訊息?)答覆,並適當HttpStatus.BAD_REQUESThttp_statusCode頭。

沒有任何例外的理由。

UPDATE

既然你是在流動的中間,它仍然是遠離回覆,你可以用異常的方式堅持下去。

你要做的還有返回正確的響應400是什麼在Http.inboundGateway()errorChannel和一些簡單的變壓器回報Message用適當的HttpHeaders.STATUS_CODE頭:

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

但再次:你不能只是拋出異常。

那就是

+0

對不起,我不明白你的答案。 –

+0

'HttpRequestHandlingEndpointSupport'可以正確解析標題中的狀態碼,並使用回覆'payload'作爲響應的主體。你不需要拋出任何異常。否則它只是'500'。您必須手動填充回覆,並在錯誤的情況下將「HttpHeaders.STATUS_CODE」添加到回覆消息中。 –

+0

好吧,你可以拋出異常,但是你必須在'Http.inboundGateway()'中添加'errorChannel',把''HttpStatus.BAD_REQUEST''值的'HttpHeaders.STATUS_CODE'頭轉換爲正確的回覆。 –