"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
:
私はあなたの答えを理解できません。 –
'HttpRequestHandlingEndpointSupport'は、ヘッダからステータスコードを適切に解決し、応答の本体として応答' payload'を使用できます。例外をスローする必要はありません。それ以外の場合は、「500」だけです。手動で返信を設定し、その間違ったケースで返信メッセージに 'HttpHeaders.STATUS_CODE'を追加する必要があります。 –
例外をスローすることができますが、 'Http.inboundGateway()'に 'errorChannel'を追加して、' HttpStatus.BAD_REQUEST'値の 'HttpHeaders.STATUS_CODE'ヘッダーを持つ適切な応答にその例外を変換する必要があります。 –