如何处理Spring中的WebClientRequestException连接拒绝异常?
解决Spring WebClient连接拒绝异常的方案
WebClientRequestException: Connection refused 本质是目标服务未启动、端口配置错误或网络不通导致的连接失败,常规的@ControllerAdvice可能不生效——因为这是Reactor异步流中的异常,需要针对性处理。
1. 先排查基础连接问题
- 确认目标服务
192.168.1.2:8080是否正常启动,端口与配置是否一致 - 用
telnet 192.168.1.2 8080或curl http://192.168.1.2:8080/health测试网络连通性 - 检查防火墙、网关是否允许当前服务访问目标地址
2. 在WebClient请求链中直接处理异常
WebClient基于Reactor,需在异步流中用onErrorResume等操作符捕获异常,避免异常扩散:
webClient.get() .uri("http://192.168.1.2:8080/health") .retrieve() .bodyToMono(String.class) .onErrorResume(WebClientRequestException.class, ex -> { // 自定义处理逻辑:日志记录、返回默认值或封装自定义异常 log.error("连接目标健康检查服务失败: {}", ex.getMessage()); return Mono.just("服务状态未知"); });
3. 全局统一处理WebClient异常
通过自定义ExchangeFilterFunction实现全局异常拦截,所有WebClient请求都会生效:
@Bean public WebClient webClient() { return WebClient.builder() .filter((request, next) -> next.exchange(request) .onErrorResume(WebClientRequestException.class, ex -> { log.error("全局捕获WebClient连接异常: {}", ex.getLocalizedMessage()); // 封装成自定义业务异常,后续可被全局异常处理器捕获 return Mono.error(new ServiceUnavailableException("依赖服务暂时无法访问")); })) .build(); }
4. 适配Reactive场景的全局异常处理器
若要让@ControllerAdvice生效,需确保方法返回Reactor类型(Mono/Flux),且异常能传播到Controller层:
@RestControllerAdvice public class GlobalReactiveExceptionHandler { @ExceptionHandler({WebClientRequestException.class, ServiceUnavailableException.class}) public Mono<ResponseEntity<String>> handleServiceConnectionError(Exception ex) { log.error("服务连接异常", ex); return Mono.just(ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE) .body("服务暂时不可用,请稍后重试")); } }
注意:如果在WebClient请求链中已经用onErrorResume消费了异常,异常就不会传播到Controller层,此时全局处理器不会触发,需根据业务场景选择处理方式。
内容的提问来源于stack exchange,提问作者Kaushal Krishna
相关产品推荐
相关产品推荐

