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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:10:20