如何将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
相关产品推荐
相关产品推荐

