如何使用Spring RestTemplate客户端读取HTTP 500错误信息
如何使用Spring RestTemplate读取HTTP 500错误信息
我来帮你搞定这个问题——当用Spring RestTemplate调用返回HTTP 500的接口时,默认它会直接抛出异常,而不是把错误响应体返回给你,所以我们需要做些小调整才能拿到服务端返回的MyOutput错误信息。下面给你两种实用的方法:
方法一:捕获异常提取响应体
RestTemplate在收到5xx类的服务端错误时,会抛出HttpServerErrorException(Spring 5及以上版本)。我们可以捕获这个异常,直接从异常对象里提取错误响应的内容:
RestTemplate restTemplate = new RestTemplate(); MyInput input = new MyInput(); // 构造你的请求参数 try { ResponseEntity<MyOutput> response = restTemplate.postForEntity( "http://your-server-domain/check-and-submit", input, MyOutput.class ); // 处理正常的成功响应 } catch (HttpServerErrorException e) { // 1. 直接获取响应体字符串 String errorJson = e.getResponseBodyAsString(); // 2. 或者直接转成你的MyOutput对象(Spring 5.2+支持) MyOutput errorResponse = e.getResponseBodyAs(MyOutput.class); // 假设MyOutput有获取错误信息的方法,比如getErrorMsg() System.out.println("校验失败错误信息:" + errorResponse.getErrorMsg()); }
如果你的Spring版本低于5.2,没法用getResponseBodyAs(),可以用ObjectMapper手动解析字符串:
ObjectMapper objectMapper = new ObjectMapper(); MyOutput errorResponse = objectMapper.readValue(e.getResponseBodyAsString(), MyOutput.class);
方法二:自定义错误处理器(避免抛出异常)
如果你希望RestTemplate遇到5xx错误时不抛出异常,而是直接返回包含错误的ResponseEntity,可以自定义一个ResponseErrorHandler:
首先实现ResponseErrorHandler接口:
import org.springframework.http.HttpStatus; import org.springframework.http.client.ClientHttpResponse; import org.springframework.web.client.ResponseErrorHandler; import java.io.IOException; public class NoThrowErrorHandler implements ResponseErrorHandler { @Override public boolean hasError(ClientHttpResponse response) throws IOException { // 返回false表示所有响应都视为“无错误”,不会触发异常 return false; // 如果你只想忽略5xx错误,其他错误正常抛出,可以改成: // return !HttpStatus.Series.SERVER_ERROR.equals(HttpStatus.Series.resolve(response.getStatusCode())); } @Override public void handleError(ClientHttpResponse response) throws IOException { // 因为hasError返回false,这个方法不会被调用 } }
然后把这个处理器绑定到RestTemplate上:
RestTemplate restTemplate = new RestTemplate(); restTemplate.setErrorHandler(new NoThrowErrorHandler()); MyInput input = new MyInput(); ResponseEntity<MyOutput> response = restTemplate.postForEntity( "http://your-server-domain/check-and-submit", input, MyOutput.class ); // 根据状态码判断是否是500错误 if (HttpStatus.INTERNAL_SERVER_ERROR.equals(response.getStatusCode())) { MyOutput errorResponse = response.getBody(); // 处理错误信息 } else { // 处理成功响应 }
适配你的服务端代码
结合你提供的Controller代码,当参数校验失败时,服务端会返回封装了错误信息的MyOutput对象。不管用上面哪种方法,你都能正确解析出这个对象,拿到校验失败的具体内容。
内容的提问来源于stack exchange,提问作者soufrk
相关产品推荐
相关产品推荐

