Spring Boot微服务调用时如何获取500错误的响应体?
如何让RestTemplate获取Spring Boot自定义500错误响应体
当使用RestTemplate调用返回自定义错误响应的Spring Boot接口时,默认遇到5xx状态码会抛出HttpServerErrorException,而ex.getMessage()仅返回状态码和原因短语,无法直接拿到自定义响应体。解决方法如下:
方法一:从异常中提取并解析响应体
在catch块中,利用异常对象的getResponseBodyAsString()方法获取原始JSON响应,再反序列化为ErrorDTO:
try { ResponseEntity<ResponseDemo> result = restTemplate.postForEntity(uri, requestDemos, ResponseDemo.class); log.info("Success response: {}", result); ResponseDemo body = result.getBody(); log.info("body= {}", body); } catch (HttpClientErrorException | HttpServerErrorException ex) { log.error("ERROR at POST {}", ex.getMessage()); // 提取自定义错误响应体 String errorJson = ex.getResponseBodyAsString(); ObjectMapper objectMapper = new ObjectMapper(); try { ErrorDTO errorDTO = objectMapper.readValue(errorJson, ErrorDTO.class); // 处理自定义错误信息,比如记录或返回 log.info("Received custom error: code={}, message={}, text={}", errorDTO.getCode(), errorDTO.getMessage(), errorDTO.getText()); } catch (JsonProcessingException e) { log.error("Failed to parse error response", e); } }
方法二:自定义RestTemplate错误处理器
修改RestTemplate的错误处理逻辑,使其不抛出异常,直接返回包含错误状态码和响应体的ResponseEntity:
// 初始化自定义错误处理器的RestTemplate RestTemplate restTemplate = new RestTemplate(); restTemplate.setErrorHandler(new DefaultResponseErrorHandler() { @Override public void handleError(ClientHttpResponse response) throws IOException { // 取消默认的异常抛出逻辑,让请求正常返回ResponseEntity } }); // 调用接口并处理结果 ResponseEntity<Object> response = restTemplate.postForEntity(uri, requestDemos, Object.class); if (response.getStatusCode().is2xxSuccessful()) { // 处理成功响应 ResponseDemo successBody = new ObjectMapper().convertValue(response.getBody(), ResponseDemo.class); log.info("Success response: {}", successBody); } else { // 处理错误响应 ErrorDTO errorDTO = new ObjectMapper().convertValue(response.getBody(), ErrorDTO.class); log.info("Custom error response: {}", errorDTO); }
注意事项
- 调用方微服务中必须存在相同结构的
ErrorDTO类,确保序列化/反序列化兼容; - 方法二需要自行处理所有状态码分支,适合需要统一处理成功和错误响应的场景。
内容的提问来源于stack exchange,提问作者elvis
相关产品推荐
相关产品推荐

