Spring Cloud Gateway — не удается найти GatewayFilterFactory с именем [Filter_Name]

#spring-boot #spring-cloud #spring-cloud-gateway

#spring-boot #spring-cloud #spring-cloud-gateway

Вопрос:

У меня есть приложение Spring cloud gateway. Я пытаюсь настроить фильтр шлюза. Версия Spring Boot 2.3.4.RELEASE — это зависимости:

 dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    implementation platform(SpringBootPlugin.BOM_COORDINATES)
    implementation platform('org.springframework.cloud:spring-cloud-dependencies:Hoxton.SR8')
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
    implementation 'org.springframework.cloud:spring-cloud-starter-sleuth'
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'

}
  

Вот конфигурация для клиента шлюза

 server:
  port: 8081
spring:
  cloud:
    gateway:
      routes:
        - id: onboard_redirect
          uri: http://localhost:8080/api/v1/onboard
          predicates:
            - Path=/api/v1/onboard
          filters:
            - name: MyLogging
              args:
                baseMessage: My Custom Message
                preLogger: true
                postLogger: true
  

Вот мой класс фильтра:

 @Component
public class MyLoggingGatewayFilterFactory extends AbstractGatewayFilterFactory<MyLoggingGatewayFilterFactory.Config> {

    final Logger logger =
            LoggerFactory.getLogger(MyLoggingGatewayFilterFactory.class);

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

    @Override
    public GatewayFilter apply(Config config) {
        return (exchange, chain) -> {
            // Pre-processing
            if (config.preLogger) {
                logger.info("Pre GatewayFilter logging: "
                          config.baseMessage);
            }
            return chain.filter(exchange)
                    .then(Mono.fromRunnable(() -> {
                        // Post-processing
                        if (config.postLogger) {
                            logger.info("Post GatewayFilter logging: "
                                      config.baseMessage);
                        }
                    }));
        };
    }

    public static class Config {
        public String baseMessage;
        public boolean preLogger;
        public boolean postLogger;
    }
}
  

Все работает без настройки фильтра, но когда я настраиваю фильтр, я получаю следующую ошибку:

 reactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.IllegalArgumentException: Unable to find GatewayFilterFactory with name MyLogging
Caused by: java.lang.IllegalArgumentException: Unable to find GatewayFilterFactory with name MyLogging
  

что я здесь делаю не так?

Комментарии:

1. если вы введете точку останова, MyLoggingGatewayFilterFactory() она попадет?

2. Нет, это не так, приложение не запускается

3. В этом проблема. Ваш @Component файл не обнаруживается при сканировании. Попробуйте создать MyLoggingGatewayFilterFactory @Bean в классе конфигурации.

Ответ №1:

Класс фильтра MyLoggingGatewayFilterFactory не MyLogging такой, как вы задали в своих свойствах.

Попробуйте внести следующие изменения в свой application.yml файл:

 filters:
    - name: MyLoggingGatewayFilterFactory
  

Комментарии:

1. На самом деле, установка имени фильтра на MyLogging также очень допустима, поскольку имя класса фильтра MyLoggingGatewayFilterFactory соответствует соглашению Spring об именовании для разрешения этих фильтров…. Он просто должен удовлетворять таким именам, как <filter-name>GatewayFilterFactory

Ответ №2:

Добавьте эту зависимость в файл application.properties.

 <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-circuitbreaker-reactor- 
     resilience4j</artifactId>
</dependency>