能否在Spring Web MVC项目中使用Spring WebFlux及WebClient替代RestTemplate?
关于WebClient替代RestTemplate的常见问题解答
1. Spring WebFlux 和 Spring Web MVC 完全可以共存
Spring Boot 原生支持 MVC 和 WebFlux 混合部署:
- 当类路径里同时有
spring-webmvc(MVC核心)和spring-webflux依赖时,默认会用 MVC 的DispatcherServlet启动项目,不会自动切换到响应式的 web 栈。只有当你主动配置ReactiveWebServerFactory时,才会启用响应式环境。 - 这种模式正好适配你的需求:原有项目是传统 MVC 架构,只需要引入 WebFlux 相关依赖来用 WebClient,完全不影响现有业务代码的运行。
2. 不能脱离 WebFlux 依赖使用 WebClient
WebClient 是 Spring WebFlux 模块的专属组件,Spring MVC 本身并没有提供这个客户端实现。不过你不用纠结要不要引入完整的 spring-boot-starter-webflux:
- 直接引入 starter 是最省心的方式,它会自动帮你配齐 WebClient 所需的所有依赖(比如 reactor 反应式框架)。
- 如果你不想引入整个 starter,也可以单独加
spring-webflux和reactor-core依赖,但本质上还是要依赖 WebFlux 模块。
依赖配置示例(Maven)
完整starter配置:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency>
或者单独引入核心依赖:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webflux</artifactId> </dependency> <dependency> <groupId>io.projectreactor</groupId> <artifactId>reactor-core</artifactId> </dependency>
3. MVC项目里用WebClient的小提示
- WebClient 是异步非阻塞的,调用后返回
Mono/Flux类型。如果需要同步拿结果,可以用block(),但注意在 MVC 的请求线程里用block()会阻塞线程,建议尽量用异步方式处理(比如结合@Async或者控制器返回CompletableFuture)。 - 可以通过
WebClient.Builder来配置全局的基础URL、拦截器、超时时间等,用法和 RestTemplate 的配置逻辑类似。
内容的提问来源于stack exchange,提问作者Wasim
相关产品推荐
相关产品推荐

