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

如何将Spring Reactor Mono处理为类似Optional以应对HTTP 404

解决WebClient 404转空Mono的方案

你可以通过Reactor的onErrorResume操作符捕获WebClient抛出的404异常,将其转换为Mono.empty(),同时保留其他错误让上层处理。具体实现如下:

webClient.get().uri(FOOBAR_BY_ID_PATH, id)
    .accept(MediaType.APPLICATION_JSON)
    .retrieve()
    .bodyToMono(FooBar.class)
    .onErrorResume(WebClientResponseException.NotFound.class, ex -> Mono.empty());

细节说明:

  • WebClientResponseException.NotFound.class是Spring专门对应404状态的异常子类,直接捕获这个类型最精准,不会误判其他HTTP状态码。
  • 未被捕获的其他异常(包括404以外的HTTP错误、网络异常等)会自动向上抛出,留给上层消费者处理,符合你“仓库不暴露HTTP细节”的需求。
  • 处理后,当服务返回404时,仓库返回的Mono<FooBar>会变成空(等价于Optional.empty()的Reactor形式),上层可以通过switchIfEmpty等操作符处理空值场景,完全感知不到HTTP相关错误。

如果需要更灵活的状态码判断(比如同时处理多个特定状态),也可以写成:

webClient.get().uri(FOOBAR_BY_ID_PATH, id)
    .accept(MediaType.APPLICATION_JSON)
    .retrieve()
    .bodyToMono(FooBar.class)
    .onErrorResume(ex -> {
        if (ex instanceof WebClientResponseException webEx 
            && webEx.getStatusCode() == HttpStatus.NOT_FOUND) {
            return Mono.empty();
        }
        return Mono.error(ex);
    });

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:43:10