Spring Api Gateway自定义过滤器不生效问题排查求助
Spring Cloud Gateway自定义过滤器打印仅启动时输出,请求时无触发的排查方案
1. 核心逻辑位置错误
你把System.out.println写在了apply方法中,但apply是路由初始化阶段执行的(每个路由加载时调用一次),并非每次请求触发。真正的请求处理逻辑需要放在返回的GatewayFilter的filter方法(即lambda表达式内部):
@Override public GatewayFilter apply(Config config) { return (exchange, chain) -> { // 这里才是每次请求都会执行的逻辑 System.out.println("--------------here----------- "); String originalPath = exchange.getRequest().getPath().toString(); String newPath = "/timing/" + testService.evaluateCurrentDate(); URI uri = UriComponentsBuilder.fromUri(exchange.getRequest().getURI()).path(newPath).build(true).toUri(); ServerHttpRequest request = exchange.getRequest().mutate().uri(uri).build(); return chain.filter(exchange.mutate().request(request).build()); }; }
2. 构造函数名称与类名不匹配
你的类名是TimingGatewayFilterFactory,但构造函数写的是public TimingFilter(),这违反Java语法规范,会导致Spring无法正确初始化过滤器工厂类。修正构造函数名称:
public TimingGatewayFilterFactory() { super(Config.class); }
3. 验证路由匹配是否生效
你已开启debug: true,可以通过日志确认请求是否匹配到identity-time路由:
- 启动时查看日志,确认
identity-time路由已加载,且包含Timing过滤器 - 请求
http://localhost:8080/timing时,检查debug日志中是否有Route matched: identity-time的记录。如果没有,可尝试调整路径匹配规则为Path=/timing,/timing/**,确保根路径/timing能被匹配。
4. 确认组件扫描范围
确保TimingGatewayFilterFactory类所在的包在Spring Boot的组件扫描路径下(即@SpringBootApplication注解所在包或其子包),否则@Component注解无法生效,过滤器工厂不会被注册。
内容的提问来源于stack exchange,提问作者Jonio
相关产品推荐
相关产品推荐

