背景

在springcloud gateway中使用feign时,网关一般都会用到gatewayFilter.但在gatewayFilter沒法注入feign。这和servlet, filter的加载顺序有关

解决办法

从spring上下文中获取feign的自定义Bean,然后在正常用

1 工具类

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;

public class AutowiredBean{

   private static ApplicationContext applicationContext;

   public static void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
      if (AutowiredBean.applicationContext == null) {
         AutowiredBean.applicationContext = applicationContext;
      }
   }

   public static ApplicationContext getApplicationContext() {
      return applicationContext;
   }

   public static Object getBean(String name) {
      return getApplicationContext().getBean(name);
   }

   public static <T> T getBean(Class<T> clazz) {
      return getApplicationContext().getBean(clazz);
   }

   public static <T> T getBean(String name, Class<T> clazz) {
      return getApplicationContext().getBean(name, clazz);
   }

}

2、启动类

a

@SpringBootApplication
@EnableFeignClients(basePackages = "aaaa.bb")
public class JupyterApplication {
   public static void main(String[] args) {
      ConfigurableApplicationContext run = SpringApplication.run(JupyterApplication.class, args);
      AutowiredBean.setApplicationContext(run);
   }
}

3、使用

public class AuthorizeGatewayFilter implements GatewayFilter, Ordered {
   Logger logger = LoggerFactory.getLogger(AuthorizeGatewayFilter.class);

   private static String HEADER_KEY = "token";

   @Override
   public int getOrder() {
      return 100;
   }

   @Override
   public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
   
   	  //关键看这里,在用的时候在获取bean
      JupyterAuthService jupyterAuthService = AutowiredBean.getBean(JupyterAuthService.class);
      
      String record = jupyterAuthService.record();
      return chain.filter(exchange);
   }
}
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐