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

使用WebClient发起请求无报错但无结果时如何返回空Mono

WebClient返回空Mono实现方案

默认情况下WebClient的retrieve()方法在遇到404等异常状态码时会直接抛出异常,不会返回空Mono,可通过以下两种方式实现需求:

方法1:通过onStatus配置状态码处理规则

匹配到无结果的状态(通常是404)时直接返回空Mono,跳过异常抛出逻辑:

public User getUserByUsername(String username) {
    Mono<User> user = webClient.get().uri(uriBuilder -> uriBuilder
            .path("localhost:8090/user/getByUsername")
            .queryParam("username", username)
            .build())
            .retrieve()
            // 匹配404状态返回空Mono,可按需替换为HttpStatus::is4xxClientError覆盖所有4xx错误
            .onStatus(status -> status == HttpStatus.NOT_FOUND, resp -> Mono.empty())
            .bodyToMono(User.class);

    User userRet = user.block();
    return userRet;
}

方法2:使用exchangeToMono自定义全响应处理

如果需要更灵活的判断逻辑(比如后端返回200但空body、或响应体符合特定条件时返回空),可自行处理完整响应:

public User getUserByUsername(String username) {
    Mono<User> user = webClient.get().uri(uriBuilder -> uriBuilder
            .path("localhost:8090/user/getByUsername")
            .queryParam("username", username)
            .build())
            .exchangeToMono(resp -> {
                // 仅2xx状态码尝试解析响应体,其余情况返回空Mono
                if (resp.statusCode().is2xxSuccessful()) {
                    return resp.bodyToMono(User.class);
                }
                return Mono.empty();
            });

    User userRet = user.block();
    return userRet;
}

注意:空Mono调用block()方法后会直接返回null,和你现有代码的返回逻辑完全兼容,无需调整后续返回值处理规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:24:04