踩坑记录 | Spring Cloud Gateway 网关依赖问题
今天在项目中尝试引入 Spring Cloud Gateway 网关时,遇到了一个奇怪的问题——按照官方文档插入了 demo 代码后,出现了多处报错,特别是 Cannot resolve symbol 'RouteLocator'
,让我一度感到困惑。
问题描述:
我在项目中按照 Spring Cloud Gateway 官方文档的示例,尝试插入一些基本的网关代码。代码如下:
package com.nx.nxapigateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
/**
* nxapi gateway application
*
* @author nx-xn2002
*/
@SpringBootApplication
public class NxapiGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(NxapiGatewayApplication.class, args);
}
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("path_route", r -> r.path("/get")
.uri("http://httpbin.org"))
.route("host_route", r -> r.host("*.myhost.org")
.uri("http://httpbin.org"))
.build();
}
}
但是 IDEA 到处爆红:
报错信息中提到 Cannot resolve symbol 'RouteLocator'
,这让我怀疑是不是依赖没有正确引入,或者版本不兼容。
问题分析:
经过一番排查,我发现问题出在引入的依赖上。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway-mvc</artifactId>
</dependency>
根据官方文档,应该引入 spring-cloud-starter-gateway
这个依赖,而 IDEA 中自动引入的是 spring-cloud-starter-gateway-mvc
,这显然是导致报错的原因。
在官方文档中也明确提到:
要运行您自己的网关,请使用
spring-cloud-starter-gateway
依赖项。
而 spring-cloud-starter-gateway-mvc
是一个为集成 Spring MVC 特别设计的模块,缺少一些基础的网关功能,比如 RouteLocator
,因此会导致此类问题。
解决方案:
我按照官方建议,更改了项目的依赖文件,删除了 spring-cloud-starter-gateway-mvc
,并引入了正确的 spring-cloud-starter-gateway
依赖,具体修改如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
修改后,重新启动项目,网关成功启动,报错问题也解决了
总结:
这个问题让我意识到,在使用框架时,特别是涉及到微服务架构的第三方组件时,依赖的选择十分关键。虽然 spring-cloud-starter-gateway-mvc
也包含了网关相关功能,但它不适用于此处独立网关场景,反而可能导致功能缺失。引入正确的依赖 spring-cloud-starter-gateway
后,问题迎刃而解
反思:
在进行项目依赖更新或引入新依赖时,一定要注意:
查阅官方文档:有些库在不同的版本或不同的功能场景下,依赖会发生变化
依赖版本和功能:一些小版本的更新可能会将某些功能分离成独立的依赖,需要留意是否有需要额外引入的模块
错误信息的提示:面对报错时,要善于从错误信息中提取关键信息,快速定位问题的根本原因
以上是我今天遇到的 Spring Cloud Gateway 依赖问题,希望对大家有所帮助