使用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
相关产品推荐
相关产品推荐

