如何让Http Client Interface在40X/50X错误时返回ResponseEntity
解决WebClient HttpServiceProxyFactory返回ResponseEntity时不抛出4xx/5xx异常的问题
要让你的FooInterface方法返回携带错误状态码的ResponseEntity而非抛出WebClientResponseException,核心是修改WebClient的错误处理逻辑,阻止它对4xx/5xx响应自动抛出异常,具体步骤如下:
1. 配置WebClient的错误处理器
在构建WebClient实例时,通过defaultStatusHandler指定对所有错误状态码(4xx/5xx)不抛出异常,而是继续传递响应供后续包装为ResponseEntity:
WebClient webClient = WebClient.builder() // 对所有HTTP错误状态码,返回空Mono以跳过异常抛出逻辑 .defaultStatusHandler(HttpStatus::isError, clientResponse -> Mono.empty()) .build();
2. 用配置后的WebClient创建代理工厂
保持原有的代理工厂创建逻辑,使用上面配置好的WebClient即可:
HttpServiceProxyFactory factory = HttpServiceProxyFactory .builderFor(WebClientAdapter.create(webClient)) .build(); return factory.createClient(FooInterface.class);
原理说明
HttpServiceProxyFactory默认会使用WebClient的retrieve()方法处理请求,该方法的默认行为是对4xx/5xx响应抛出WebClientResponseException。通过配置defaultStatusHandler,我们覆盖了这一默认行为,让WebClient将所有响应(包括错误状态码的响应)都传递下去,这样代理就能将响应完整包装为ResponseEntity返回,其中包含对应的状态码和响应体(如果存在)。
内容的提问来源于stack exchange,提问作者Alan Moffet
相关产品推荐
相关产品推荐

