同时引入spring-web和spring-webflux时设置REACTIVE web类型不生效怎么解决
问题根因
- Spring Boot 会根据 classpath 下的依赖自动判定 Web 应用类型,当同时存在 spring-web(Servlet 栈)和 spring-webflux(Reactive 栈)依赖时,默认优先级为 SERVLET 类型
- 你手动设置类型不生效是因为代码写法错误:实例化
SpringApplication后调用的是静态run方法,该方法会重新创建一个全新的SpringApplication实例,之前的配置完全不生效 - 报错的直接原因是项目中同时存在
@EnableWebMvc和@EnableWebFlux两个互斥的注解配置
解决方案
1. 排查注解冲突
全局搜索项目代码以及引入的二方/三方依赖中的配置类,移除所有 @EnableWebMvc 注解,仅保留 @EnableWebFlux 即可。
2. 修正手动设置 Web 类型的代码
将原代码调整为调用实例的 run 方法,仅传入启动参数:
SpringApplication app = new SpringApplication(MyApplication.class); app.setWebApplicationType(WebApplicationType.REACTIVE); // 不要调用静态run方法,使用实例的run方法仅传参数 app.run(args);
3. 配置文件强制指定(可选,优先级更高)
也可以直接在配置文件中固定 Web 应用类型,无需写代码设置:
- application.properties 写法:
spring.main.web-application-type=reactive
- application.yml 写法:
spring: main: web-application-type: reactive
4. 从根源移除Servlet依赖(推荐)
如果业务不需要使用 Spring MVC 的任何能力,建议直接把 spring-web 相关依赖从构建配置中排除,彻底避免冲突。
Maven 排除示例:
<dependency> <groupId>引入spring-web的上层依赖groupId</groupId> <artifactId>引入spring-web的上层依赖artifactId</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </exclusion> </exclusions> </dependency>
注意事项
- Reactive 模式不支持原生 Servlet 组件(如
Filter、Servlet),如果项目中存在这类组件需要替换为 WebFlux 对应的WebFilter等实现,否则应用仍会被识别为 SERVLET 类型。
内容的提问来源于stack exchange,提问作者Spartacus
相关产品推荐
相关产品推荐

