Spring Cloud Gateway启动失败:routeDefinitionRouteLocator Bean创建异常
问题分析
这个启动错误的核心逻辑是:当网关同时引入Spring Security和自定义框架的Spring Security Core依赖时,Spring Cloud Gateway的自动配置被意外触发了gRPC相关过滤器(jsonToGRPCFilterFactory、grpcSslConfigurer)的创建流程,但项目中并未引入io.grpc.netty.NettyChannelBuilder所在的依赖包,最终导致类找不到的异常。
解决方案
1. 排除Gateway的gRPC自动配置类
直接阻止Spring创建不需要的gRPC相关Bean,是最直接的解决方式:
方式A:启动类注解排除
@SpringBootApplication(exclude = { GrpcSslAutoConfiguration.class, JsonToGrpcGatewayFilterAutoConfiguration.class }) public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class, args); } }
方式B:配置文件排除
在application.yml中添加:
spring: autoconfigure: exclude: - org.springframework.cloud.gateway.config.GrpcSslAutoConfiguration - org.springframework.cloud.gateway.config.JsonToGrpcGatewayFilterAutoConfiguration
2. 排查并移除冗余的gRPC依赖
通过依赖树工具找出间接引入的gRPC相关依赖,手动排除:
Maven操作
先查看依赖树:
mvn dependency:tree | grep grpc
如果发现自定义框架间接引入了gRPC依赖,在网关的pom.xml中排除:
<dependency> <groupId>你的自定义框架GroupId</groupId> <artifactId>你的自定义框架ArtifactId</artifactId> <exclusions> <exclusion> <groupId>io.grpc</groupId> <artifactId>grpc-netty</artifactId> </exclusion> <!-- 其他gRPC相关依赖可一并排除 --> </exclusions> </dependency>
Gradle操作
先查看依赖树:
./gradlew dependencies | grep grpc
排除冗余依赖:
implementation('你的自定义框架GroupId:你的自定义框架ArtifactId') { exclude group: 'io.grpc', module: 'grpc-netty' // 其他gRPC相关依赖排除 }
3. 调整Security依赖作用域(可选)
如果自定义框架中的Spring Security Core仅提供工具类,不需要在网关中激活Security自动配置,可以将其依赖作用域设为非编译生效:
Maven
<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-core</artifactId> <scope>provided</scope> </dependency>
Gradle
compileOnly 'org.springframework.security:spring-security-core'
内容的提问来源于stack exchange,提问作者Harish Joshy
相关产品推荐
相关产品推荐

