You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Spring Integration的advice中获取outbound gateway的500错误响应体

解决方案

默认情况下,Spring的RestTemplate收到4xx、5xx状态码时会抛出HttpStatusCodeException的子类(4xx对应HttpClientErrorException,5xx对应HttpServerErrorException),异常对象本身已经内置了响应状态码、响应头、响应体的完整数据,你只需要调整Advice配置把异常传递到失败处理通道即可。

步骤1:修改Advice的失败表达式

你当前配置的onFailureExpressionString("payload")仅会把原请求的payload发送到失败通道,修改表达式将异常对象也传递过去:

@Bean
public Advice advice() {
    final ExpressionEvaluatingRequestHandlerAdvice advice = new ExpressionEvaluatingRequestHandlerAdvice();
    advice.setFailureChannelName("channelAdvice");
    // 上下文内置#exception变量对应本次调用抛出的异常
    advice.setOnFailureExpressionString("#exception");
    advice.setTrapException(true);
    return advice;
}

如果需要同时获取原请求的payload,可以用Map封装两个信息:

// 同时传递原请求payload和异常
advice.setOnFailureExpressionString("T(java.util.Map).of('originalPayload', #root.payload, 'exception', #exception)");

步骤2:调整失败通道的处理逻辑,提取响应体

@ServiceActivator(inputChannel = "channelAdvice")
public void activatorAdvice(Message<?> message) {
    // 如果上一步只传了异常,直接取payload强转
    if (message.getPayload() instanceof HttpStatusCodeException statusCodeException) {
        // 获取500错误对应的响应体
        String responseBody = statusCodeException.getResponseBodyAsString();
        // 获取响应状态码
        HttpStatus status = statusCodeException.getStatusCode();
        // 后续业务逻辑
    }

    // 如果上一步用了Map封装,按下面的方式取
    // Map<String, Object> result = (Map<String, Object>) message.getPayload();
    // Object originalPayload = result.get("originalPayload");
    // HttpStatusCodeException exception = (HttpStatusCodeException) result.get("exception");
}

内容的提问来源于stack exchange,提问作者Sanal M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 14:36:03