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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 02:45:11