自定义工厂类,配置后无法找到指定名称的GatewayFilterFactory

来源:13-3 升级config&product&api-gateway(下)

示邑

2019-04-04

廖师兄好!向你请教一个问题

我编写了一个自定义工厂类 RequestTimeGatewayFilterFactory ,在.yml中配置为 ‘- RequestTime=true’,但是报了一个错误 “java.lang.IllegalArgumentException: Unable to find GatewayFilterFactory with name RequestTime”,是我忽略了什么吗?Finchley.SR2版本,求解答!

spring:
  profiles:
    active: request_time_route
spring:
  cloud:
    gateway:
      routes:
        - id: request_time_route
          uri: https://www.baidu.com/
          filters:
            - RequestTime=true
          predicates:
            - After=2019-03-20T17:42:47.789-07:00[Asia/Shanghai]
  profiles: request_time_route
@Component
public class RequestTimeGatewayFilterFactory extends AbstractGatewayFilterFactory<RequestTimeGatewayFilterFactory.Config> {
    private static final Log log = LogFactory.getLog(GatewayFilter.class);

    public RequestTimeGatewayFilterFactory() {
        super(Config.class);
    }

    @Override
    public GatewayFilter apply(Config config) {
        // grab configuration from Config object
        return new GatewayFilter() {
            @Override
            public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
                exchange.getAttributes().put("requestTimeBegin", System.currentTimeMillis());
                return chain.filter(exchange).then(Mono.fromRunnable(new Runnable() {
                    @Override
                    public void run() {
                        // Manipulate the response in some way
                        Long startTime = exchange.getAttribute("requestTimeBegin");
                        if (startTime != null) {
                            StringBuilder sb = new StringBuilder(exchange.getRequest().getURI().getRawPath())
                                    .append(": ")
                                    .append(System.currentTimeMillis() - startTime)
                                    .append("ms");
                            if (config.isWithParams()) {
                                sb.append(" params:").append(exchange.getRequest().getQueryParams());
                            }
                            log.info(sb.toString());
                        }
                    }
                }));
            }
        };
    }

    @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList("withParams");
    }

    public static class Config {
        // Put the configuration properties for your filter here
        private boolean withParams;

        public boolean isWithParams() {
            return withParams;
        }

        public void setWithParams(boolean withParams) {
            this.withParams = withParams;
        }
    }
}
写回答

3回答

廖师兄

2019-04-08

spring:
  cloud:
    gateway:
      routes:
        - id: request_time_route
          uri: https://www.baidu.com/
          filters:
            - RequestTime=true

你这不是用的zuul吧?我没有研究过,你去看看官方的例子是怎么用的

1
1
示邑
OK!多谢!
2019-04-11
共1条回复

weixin_慕妹4147359

2021-05-22

123

0
0

廖师兄

2019-04-05

配置里应该用冒号
RequestTime: true

0
1
示邑
启动报错: Description: Binding to target [Bindable@1c3fcb7 type = java.util.List, value = 'provided', annotations = array[@javax.validation.Valid()]] failed: Property: spring.cloud.gateway.routes[0].filters[0].requesttime Value: true Origin: class path resource [application.yml]:49:28 Reason: The elements [spring.cloud.gateway.routes[0].filters[0].requesttime] were left unbound. Action: Update your application's configuration Process finished with exit code 1
2019-04-08
共1条回复

SpringCloud Finchley(M2+RELEASE+SR2)微服务实战

SpringCloud组件实现微服务,【已升级Finchley.Release】

5673 学习 · 2489 问题

查看课程