Spring Gateway依赖引发clientRegistrationRepository不能为空异常排查
问题:引入spring-cloud-starter-gateway-mvc后,WebFlux+Okta OAuth2出现clientRegistrationRepository不能为空错误
我用WebFlux结合Okta实现OAuth2.0认证,此前相同配置的项目能正常运行,但重新创建或部署时出现clientRegistrationRepository不能为空的错误。逐个移除依赖排查后,确认是spring-cloud-starter-gateway-mvc依赖导致的问题。
相关配置如下:
OAuth2LoginConfig.java
@Configuration @EnableWebFluxSecurity public class OAuth2LoginConfig { @Bean public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) { http .authorizeExchange(authorize -> authorize .anyExchange().authenticated() ) .oauth2Login(Customizer.withDefaults()); return http.build(); } }
application.yml
server: port: 9098 spring: main: allow-bean-definition-overriding: true application: name: dummy-okta eureka: instance: prefer-ip-address: true client: fetch-registry: true register-with-eureka: true service-url: defaultZone: http://localhost:8761/eureka okta: oauth2: issuer: https://dev-27305929.okta.com/oauth2/default audience: api://default client-id: 0oahgmcygbKzqfnwk5d7 client-secret: CJTkPspyDVwiNLTvtPWySF-R8P30yi2x8aWuy-272SXIwYlUcLzUZ93LSJjuj-Ev scopes: openid, profile, email, offline_access
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.6</version> <relativePath /> <!-- lookup parent from repository --> </parent> <groupId>okta-dummy</groupId> <artifactId>com.api.gateway</artifactId> <version>0.0.1-SNAPSHOT</version> <name>okta-dummy</name> <description>okta dummy test project</description> <properties> <java.version>17</java.version> <spring-cloud.version>2023.0.1</spring-cloud.version> </properties> <dependencies> <!-- okta security and spring security dependancy --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>com.okta.spring</groupId> <artifactId>okta-spring-boot-starter</artifactId> <version>3.0.6</version> </dependency> <!-- cloud gateway and webflux dependancy --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway-mvc</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>io.projectreactor</groupId> <artifactId>reactor-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project>
解决方案
问题根源
spring-cloud-starter-gateway-mvc是基于Servlet栈的网关实现,而你使用的WebFlux属于Reactive响应式栈,两者引入的Spring Security组件存在冲突:
- Okta的starter会根据当前环境自动创建对应的
ClientRegistrationRepositoryBean:Reactive环境下应该创建ReactiveClientRegistrationRepository,Servlet环境下创建ClientRegistrationRepository。 - 引入Gateway MVC依赖后,类路径中混入了Servlet栈的Security类,导致Spring容器优先加载Servlet版本的Bean,而你的
SecurityWebFilterChain(Reactive栈)需要的是ReactiveClientRegistrationRepository,最终因找不到匹配的Bean报错“clientRegistrationRepository不能为空”。
解决步骤
- 替换网关依赖:把
spring-cloud-starter-gateway-mvc换成spring-cloud-starter-gateway——这是专门为WebFlux设计的Reactive网关依赖,和你的技术栈完全匹配:<!-- 移除冲突依赖 --> <!-- <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway-mvc</artifactId> </dependency> --> <!-- 添加正确的Reactive网关依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> - 清理冲突依赖:检查pom.xml,确保没有同时引入Servlet栈的Web依赖(比如
spring-boot-starter-web),避免类路径冲突。 - 重新构建验证:执行
mvn clean install清理并构建项目,启动后Okta的starter会自动创建ReactiveClientRegistrationRepositoryBean,配合@EnableWebFluxSecurity就能正常完成OAuth2认证流程。
内容的提问来源于stack exchange,提问作者Rani
相关产品推荐
相关产品推荐

