如何在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
相关产品推荐
相关产品推荐

