Spring integration Spring集成:在响应中保留http错误代码和正文

Spring integration Spring集成:在响应中保留http错误代码和正文,spring-integration,spring-integration-dsl,Spring Integration,Spring Integration Dsl,我有一个入站http网关,它的入站消息被传递到出站http网关(使用IntegrationJavaDSL) 当出站网关响应具有http状态200时,出站响应将按预期返回到入站网关的调用者 但当出站网关响应特定的客户端错误(如423锁定或403禁止)时,入站网关的调用者将收到500和一条正文消息,其中包含一个异常字符串 我理解这是因为SI将出站http错误作为异常处理。但在我的例子中,我需要将错误状态和出站响应附带的响应主体传递回入站网关的调用者,以获取特定的错误代码。如何做到这一点?我们将此场景

我有一个入站http网关,它的入站消息被传递到出站http网关(使用IntegrationJavaDSL)

当出站网关响应具有http状态200时,出站响应将按预期返回到入站网关的调用者

但当出站网关响应特定的客户端错误(如423锁定或403禁止)时,入站网关的调用者将收到500和一条正文消息,其中包含一个异常字符串


我理解这是因为SI将出站http错误作为异常处理。但在我的例子中,我需要将错误状态和出站响应附带的响应主体传递回入站网关的调用者,以获取特定的错误代码。如何做到这一点?

我们将此场景称为HTTP代理,并对该问题进行了一些测试:

我刚刚做了一些调查,以下是您需要的:

IntegrationFlows
    .from(Http.inboundGateway("/service")
            .requestMapping(r -> r.params("name"))
            .errorChannel("httpProxyErrorFlow.input"))
...

@Bean
public IntegrationFlow httpProxyErrorFlow() {
    return f -> f
            .transform(Throwable::getCause)
            .<HttpClientErrorException>handle((p, h) ->
                    MessageBuilder.withPayload(p.getResponseBodyAsString())
                            .setHeader(HttpHeaders.STATUS_CODE, p.getStatusCode())
                            .build());
}

请分享您在服务出错之前看到的堆栈跟踪,即500
protected final Object setupResponseAndConvertReply(ServletServerHttpResponse response, Message<?> replyMessage) {
    getHeaderMapper().fromHeaders(replyMessage.getHeaders(), response.getHeaders());
    HttpStatus httpStatus = this.resolveHttpStatusFromHeaders(replyMessage.getHeaders());
    if (httpStatus != null) {
        response.setStatusCode(httpStatus);
    }