REST自定义异常抛出后响应实体Body为空问题求助
问题分析与解决方案
核心问题原因
你当前的代码拿不到错误响应体,主要有两个关键原因:
- RestTemplate默认行为:当接口返回非2xx状态码(比如你的400 BAD_REQUEST)时,RestTemplate的默认错误处理器会直接抛出
HttpClientErrorException,不会执行ResponseEntity<Void> res = ...这行代码的赋值逻辑。 - 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
相关产品推荐
相关产品推荐

