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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 08:22:46