gpt4 book ai didi

java - Spring 集成流程以 HTTP 400 响应

转载 作者:太空宇宙 更新时间:2023-11-04 11:42:48 24 4
gpt4 key购买 nike

我有一个 spring 集成流程,需要一个“routingkey”消息头。如果不存在,我想将 HTTP 400 响应发送回客户端。我怎样才能做到这一点?下面您将看到确定路由 key 方法,我可以在其中确定路由 key 是否作为 header 传递。

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

因此,您需要的只是常规(带有错误消息的字符串?)回复和适当的 HttpStatus.BAD_REQUEST 作为 http_statusCode header 。

任何异常(exception)都没有理由。

更新

由于您正处于流程的中间,并且距离回复还很远,因此您可以坚持使用异常方法。

要返回正确的 400 响应,您需要做的是 Http.inboundGateway() 上的 errorChannel 和一些简单的转换器,以返回带有适当 HttpHeaders.STATUS_CODE header 的 Message:

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

但再说一遍:你不能只是抛出异常。

那就是

关于java - Spring 集成流程以 HTTP 400 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42631872/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com