我在application.yml
中定义了一个自定义过滤器。我需要从YAML中的过滤器定义中获取更多参数,以便可以在自定义过滤器中执行逻辑。我定义了多个这样的路由,其中过滤器参数不同。我面临的问题是,无法读取YAML文件中指定的值。
application.yml ---
spring:
cloud:
gateway:
routes:
- id: test_route
uri: https://api.rangon.pi
predicates:
- Path=/api/staticdata/rattlefeed*
filters:
- AddRequestHeader=X-Y-Host, rangon
- TestGatewayFilter=admin, XY8382, basic
//有什么方法可以在我的自定义过滤器类中获取“ admin,XY8382,基本”
我的过滤器类
@Component
public class TestGatewayFilter implements
GatewayFilterFactory<TestGatewayFilter.Config> {
@Override
public GatewayFilter apply(Config config) {
// grab configuration from Config object
return (exchange, chain) -> {
Route r = (Route) exchange.getAttributes().get(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);
Route route = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);
// ServerWebExchange route =
// exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);
// List<GatewayFilter> list = r.getFilters();
GatewayFilter gwf = r.getFilters().get(r.getFilters().size() - 1);
Builder builder = exchange.getRequest().mutate();
// use builder to manipulate the request
return chain.filter(exchange.mutate().build());
};
}
public Config newConfig() {
Config c = new Config();
return c;
}
public static class Config {
// Put the configuration properties for your filter here
}
}
答案 0 :(得分:0)
有两种方法可以在application.yml
首先使用args关键字:
spring:
cloud:
gateway:
routes:
- id: test_route
uri: https://myapi.com
filters:
- name: TestLoggingFilter
args:
value: ThisIsATest
第二个使用内联参数:
spring:
cloud:
gateway:
routes:
- id: test_route
uri: https://myapi.com
filters:
- TestLoggingFilter=ThisIsATest
如果要使用内联参数,请确保使用包含要接收的参数名称的数组覆盖过滤器中的shortcutFieldOrder
方法,该数组还用于定义参数的顺序
以下是适用于任何先前定义的简单过滤器的示例:
package com.es.filter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.GatewayFilterFactory;
import org.springframework.stereotype.Component;
import java.util.Collections;
import java.util.List;
@Component
public class TestLoggingFilter implements GatewayFilterFactory<TestLoggingFilter.Config> {
private static final Logger LOG = LoggerFactory.getLogger(TestLoggingFilter.class);
private static final String VALUE = "value";
@Override
public Config newConfig() {
return new Config();
}
@Override
public List<String> shortcutFieldOrder() {
return Collections.singletonList(VALUE);
}
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
LOG.info("Filter enabled with value: " + config.value);
return chain.filter(exchange);
};
}
public static class Config {
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
}