Spring RestTemplate返回500错误时如何直接获取响应体不抛异常
问题根因
RestTemplate默认内置的DefaultResponseErrorHandler会对所有HTTP状态码为4xx、5xx的响应判定为请求错误,直接抛出对应HttpStatusCodeException子类异常,不会将响应体封装为正常方法返回值。你拿到的异常里携带的字符串就是接口实际返回的响应内容,只是被默认错误拦截逻辑拦截后没有走正常返回流程。
注意:你贴的原始代码存在重复声明Object obj的语法问题,编译阶段就会报错,需要删除重复的声明行。
可选解决方案
方案1:单接口捕获异常提取响应体
不需要修改RestTemplate全局配置,仅在当前调用逻辑中捕获HTTP错误异常,直接从异常对象中读取响应内容即可,适合仅个别接口需要读取错误响应的场景:
public Object pRequest(String url, Object requestBody) { Object obj = null; try { obj = restTemplate.patchForObject(url, requestBody, Object.class); System.out.println(obj); } catch (HttpServerErrorException | HttpClientErrorException e) { // 直接从异常中取出响应体字符串 String errorResp = e.getResponseBodyAsString(); System.out.println(errorResp); return errorResp; } return obj; }
方案2:自定义全局错误处理器,关闭状态码异常抛出
如果项目中所有接口都需要正常拿到4xx/5xx的响应内容,不需要RestTemplate自动抛异常,可以替换默认的错误处理器,让所有响应都走正常返回流程:
- 实现自定义的空处理错误处理器:
import org.springframework.web.client.ResponseErrorHandler; import org.springframework.http.client.ClientHttpResponse; import java.io.IOException; public class IgnoreHttpErrorHandler implements ResponseErrorHandler { @Override public boolean hasError(ClientHttpResponse response) throws IOException { // 所有响应都不判定为错误 return false; } @Override public void handleError(ClientHttpResponse response) throws IOException { // 空实现,不抛出任何异常 } }
- 给RestTemplate实例配置该处理器:
RestTemplate restTemplate = new RestTemplate(); // 注入自定义错误处理器 restTemplate.setErrorHandler(new IgnoreHttpErrorHandler());
配置完成后,修正语法问题的原调用逻辑即可正常打印响应内容,不会因为500状态码抛出异常:
public Object pRequest(String url, Object requestBody) { Object obj = restTemplate.patchForObject(url, requestBody, Object.class); System.out.println(obj); return obj; }
注意:全局关闭错误抛出后,所有RestTemplate调用都不会再因为HTTP状态码异常报错,业务逻辑中需要自行根据响应内容判断请求是否成功,适合接口统一使用业务码标识请求结果、不依赖HTTP状态码判定错误的场景。
内容的提问来源于stack exchange,提问作者Ram-the-coder
相关产品推荐
相关产品推荐

