Spring Cloud Gateway重定向404及Security配置Bean缺失问题
问题解决方法
核心问题
你碰到的两个问题根源都是Spring Cloud Gateway的反应式特性和原MVC风格配置不兼容:
- 替换
spring-cloud-starter-gateway后启动报错:Gateway是基于WebFlux的反应式网关,而你的SecurityConfig用的是Spring MVC的HttpSecurity,WebFlux环境下不会生成这个Bean,导致注入失败。 - 之前的404和现在的
NoResourceFoundException:要么路由没生效,要么请求被MVC的DispatcherServlet接管,没走到Gateway的路由逻辑。
修复步骤
1. 重写Security配置为反应式版本
把原来的MVC风格Security配置换成WebFlux专用的,用ServerHttpSecurity替代HttpSecurity:
package com.omb.ombgateway.configuration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.Customizer; import org.springframework.security.config.web.server.ServerHttpSecurity; import org.springframework.security.web.server.SecurityWebFilterChain; @Configuration public class SecurityConfig { @Bean public SecurityWebFilterChain gatewaySecurity(ServerHttpSecurity http) { http .csrf(csrf -> csrf.disable()) .sessionManagement(session -> session.sessionCreationPolicy(org.springframework.security.config.web.server.SessionCreationPolicy.STATELESS)) .authorizeExchange(exchange -> exchange .pathMatchers("/api/1.0/auth/**", "/actuator/**", "/error").permitAll() .anyExchange().authenticated() ) .oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults())); return http.build(); } }
2. 核对依赖配置
检查你的构建文件(pom.xml或build.gradle):
- 只保留
spring-cloud-starter-gateway,删掉spring-cloud-starter-gateway-mvc - 确保没有引入
spring-boot-starter-web(MVC依赖),Gateway和MVC不能共存,否则会导致请求被DispatcherServlet接管,路由失效 - 确保有
spring-cloud-starter-security和spring-boot-starter-oauth2-resource-server依赖,支持反应式Security和OAuth2资源服务器
Maven依赖示例:
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-resource-server</artifactId> </dependency> <!-- Eureka客户端 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies>
3. 验证路由和服务注册
- 打开Eureka控制台(http://localhost:8761),确认
auth-service已经成功注册 - 检查
application.yaml里的路由配置,lb://auth-service对应服务名要和auth-service的spring.application.name一致,路径匹配规则Path=/api/1.0/auth/**要和请求URL匹配
4. 排查请求接管问题
如果还是出现静态资源找不到的错误,说明请求没走到Gateway:
- 确认项目中确实没有
spring-boot-starter-web依赖 - Spring Boot 3.x版本下,确保
spring-boot-starter-webflux被正确引入(Gateway依赖会自动带,但可以手动确认)
验证
- 重启Gateway,确保启动无报错
- 启动auth-service,确认在Eureka注册成功
- 用Postman请求
http://localhost:8084/api/1.0/auth/login,此时请求应该被路由到auth-service,返回正常响应,不会再出现404或静态资源错误
内容的提问来源于stack exchange,提问作者ousmane MBINTE




