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

REST自定义异常抛出后响应实体Body为空问题求助

问题分析与解决方案

核心问题原因

你当前的代码拿不到错误响应体,主要有两个关键原因:

  1. RestTemplate默认行为:当接口返回非2xx状态码(比如你的400 BAD_REQUEST)时,RestTemplate的默认错误处理器会直接抛出HttpClientErrorException,不会执行ResponseEntity<Void> res = ...这行代码的赋值逻辑。
  2. Void类型限制:即使能拿到ResponseEntity,Void.class也无法解析响应体,最终body必然是null。

解决方案

方案1:捕获异常并解析响应体

直接捕获RestTemplate抛出的HttpClientErrorException,从异常中提取响应体并解析为你的错误对象:

String url = "/dispatchJob";
JobDispatchDTO jobDispatchDTO = new JobDispatchDTO();
JobDispatchRequestBody dispatchRequestBody = new JobDispatchRequestBody(jobDispatchDTO, 1L);
ObjectMapper objectMapper = new ObjectMapper(); // 或者使用Spring注入的实例

try {
    ResponseEntity<Void> res = restTemplate.postForEntity(url, dispatchRequestBody, Void.class);
    // 处理成功逻辑(返回204时)
} catch (HttpClientErrorException e) {
    // 从异常中获取错误响应体并解析
    DispatchJobErrorResponse errorResponse = objectMapper.readValue(
        e.getResponseBodyAsString(), 
        DispatchJobErrorResponse.class
    );
    // 这里可以拿到完整的错误信息,比如errorResponse.getMessage()、errorResponse.getJobRejectionErrorCode()
}

方案2:修改RestTemplate的错误处理策略

如果不想捕获异常,可以自定义RestTemplate的错误处理器,让它返回包含错误状态码的ResponseEntity,而非抛出异常:

// 初始化自定义错误处理的RestTemplate
RestTemplate restTemplate = new RestTemplate();
restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
    @Override
    public void handleError(ClientHttpResponse response) throws IOException {
        // 覆盖默认逻辑,不抛出异常,让RestTemplate继续处理响应
    }
});

String url = "/dispatchJob";
JobDispatchDTO jobDispatchDTO = new JobDispatchDTO();
JobDispatchRequestBody dispatchRequestBody = new JobDispatchRequestBody(jobDispatchDTO, 1L);

// 直接用错误响应类接收结果,成功时body会是null,错误时body为错误对象
ResponseEntity<DispatchJobErrorResponse> res = restTemplate.postForEntity(
    url, 
    dispatchRequestBody, 
    DispatchJobErrorResponse.class
);

if (res.getStatusCode().is4xxClientError() || res.getStatusCode().is5xxServerError()) {
    DispatchJobErrorResponse errorResponse = res.getBody();
    // 处理错误逻辑
} else {
    // 处理成功逻辑(返回204时)
}

额外提示

  • 确保DispatchJobErrorResponse类有正确的Jackson序列化/反序列化配置(比如无参构造、getter/setter,或者用@Data注解),否则解析时会报错。
  • 如果你的项目中已经配置了ObjectMapper实例,建议直接注入使用,避免重复创建。

内容的提问来源于stack exchange,提问作者jenny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 17:35:18