Spring Boot反应式应用启动报错:缺少ReactiveWebServerFactory Bean
我来帮你分析这个报错:Unable to start ReactiveWebApplicationContext due to missing ReactiveWebServerFactory bean,这个问题一般出在三个地方——要么是缺少WebFlux核心依赖,要么是没写Spring Boot必备的主启动类,要么是测试类的配置没搭对。下面我一步步给你解决:
1. 先检查WebFlux依赖是否到位
你要启动的是响应式Web应用,必须确保项目依赖里包含Spring WebFlux。根据你的构建工具,添加对应的依赖:
Maven(pom.xml)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency>
Gradle(build.gradle)
implementation 'org.springframework.boot:spring-boot-starter-webflux'
添加后刷新依赖,这是解决这个报错最常见的原因。
2. 补写Spring Boot主启动类
你的代码里只有RootController,但Spring Boot需要一个带@SpringBootApplication注解的主类来扫描组件、初始化上下文。在bubbleshadow包下创建这个类:
package bubbleshadow; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class BubbleShadowApplication { public static void main(String[] args) { SpringApplication.run(BubbleShadowApplication.class, args); } }
@SpringBootApplication自带组件扫描功能,会自动识别同包及子包下的@RestController,这样Spring才能找到你的控制器并配置好上下文。
3. 修正测试类的配置
你现在的测试类用了@SpringBootTest(classes=RootController.class),这会导致Spring只加载单个控制器,没法加载完整的WebFlux自动配置。可以改成加载主启动类,或者用更轻量的@WebFluxTest:
方案一:修改@SpringBootTest配置
package test.bubbleshadow; import bubbleshadow.BubbleShadowApplication; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; @ExtendWith(SpringExtension.class) // 改为加载主启动类,让Spring初始化完整上下文 @SpringBootTest(classes = BubbleShadowApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT) @AutoConfigureWebTestClient public class RootControllerTest { @Autowired WebTestClient webTestClient; @Test public void baseRouteShouldReturnStatusOK() { webTestClient.head().uri("/").exchange().expectStatus().isOk(); } }
方案二:用@WebFluxTest做轻量测试
如果你只是想测试WebFlux控制器,推荐用@WebFluxTest,它会只加载WebFlux相关配置,启动更快:
package test.bubbleshadow; import bubbleshadow.RootController; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.web.reactive.server.WebTestClient; @ExtendWith(SpringExtension.class) @WebFluxTest(RootController.class) public class RootControllerTest { @Autowired WebTestClient webTestClient; @Test public void baseRouteShouldReturnStatusOK() { webTestClient.head().uri("/").exchange().expectStatus().isOk(); } }
这样就不需要@SpringBootTest和@AutoConfigureWebTestClient了,@WebFluxTest会自动配置WebTestClient。
总结一下操作步骤
- 确认添加
spring-boot-starter-webflux依赖 - 创建带
@SpringBootApplication的主启动类 - 修正测试类配置,确保加载完整上下文或使用轻量测试注解
按照上面的步骤修改后,你的应用应该就能正常启动,测试也能顺利运行了。
内容的提问来源于stack exchange,提问作者Daniel Lynch

