Spring RestClient优雅处理404错误的问题求助
Spring Boot 3.2 RestClient 404错误优雅处理:返回null而非抛出解析异常
问题分析
当使用RestClient处理404响应时,若响应体为空,调用.body(Policy.class)会触发Jackson解析异常(MismatchedInputException),因为RestClient默认要求响应体必须存在且可解析。这与WebClient将空响应体转换为null的行为存在差异。
解决方案
方案一:使用exchange()手动控制响应处理
通过exchange()方法直接获取响应对象,手动判断状态码并处理响应体,灵活实现404时返回null的需求:
class CmsClient { private final RestClient restClient; private final List<HttpMessageConverter<?>> messageConverters; public CmsClient(RestClient restClient, List<HttpMessageConverter<?>> messageConverters) { this.restClient = restClient; this.messageConverters = messageConverters; } public Policy getPolicy() { return restClient.get() .uri("some/url") .accept(MediaType.APPLICATION_JSON) .exchange((request, response) -> { HttpStatusCode statusCode = response.getStatusCode(); if (HttpStatus.NOT_FOUND.equals(statusCode)) { return null; } // 复用RestClient的消息转换器解析正常响应 return new DefaultRestClient().readWithMessageConverters( response, Policy.class, messageConverters ); }); } }
方案二:用Optional接收响应体并转换为null
借助Optional包装返回类型,让RestClient将空响应体解析为Optional.empty(),最后通过orElse(null)得到目标null值:
class CmsClient { public Policy getPolicy() { return restClient.get() .uri("some/url") .accept(MediaType.APPLICATION_JSON) .retrieve() .onStatus(status -> HttpStatus.NOT_FOUND.equals(status), response -> { // 标记404为已处理,不抛出异常 }) .body(new ParameterizedTypeReference<Optional<Policy>>() {}) .orElse(null); } }
方案对比
- 方案一:完全自定义处理逻辑,适合需要对不同状态码做差异化处理的场景,灵活性最高。
- 方案二:代码更简洁,复用RestClient的默认解析流程,仅针对空响应体做适配,适合简单场景。
你的临时方案(用String.class接收后手动转换)虽然可行,但需要额外的ObjectMapper操作,增加了代码复杂度,上述两种方案均可避免该问题。
内容的提问来源于stack exchange,提问作者Coder1337
相关产品推荐
相关产品推荐

