2017-03-06 89 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'头转换为正确的回复。 –