在zuulFilter中注入bean失败的解决方案

 更新时间:2021年07月09日 14:25:49   作者:矿泉  
这篇文章主要介绍了在zuulFilter中注入bean失败的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

zuulFilter注入bean失败

一、为什么要用到这个

上周想实现在网关层 zuul 实现用户认证操作,即需要在网关过滤器中调用其他的微服务,按常规做法在 filter 中用 @Autowired 注解一个feign 接口,启动 一直失败,用度娘谷歌查了又查,只找到一些类似【在过滤器中注入bean】失败,但说的都是springMVC 并不是springcloud中的网关层

二、解决方法

查了很久,最终发现问题所在,其实在启动报错就提示很明显了,找不到相关实例,没错feign接口的实现类事实上在其他微服务中,自然不能用常规方法去注入,解决方法其实也很简单,就是在 启动类中 加入注解

@EnableFeignClient

声明这个 zuul 也是一个需要 feign 客户端,问题解决。

过滤器使用与bean注入

一、web.xml中各元素启动顺序

在项目启动时,监听器listener最先初始化,然后是过滤器filter,最后是servlet。

Spring监听器在启动时会读取spring配置文件,进行spring容器的初始化。springMVC的dispatcherServlet初始化时会读取springMVC的配置文件,进行springMVC容器的初始化。Spring容器初始化时会实例化各个bean。(个人认为web容器初始化时其中的各元素是按上述顺序依次初始化的,其他元素全部初始化完成之后web容器才初始化完成。但目前没有看到过一个十分确切的说法,等以后有时间研究一下源码)。

二、过滤器的使用

网上很多资料说在过滤器中拿不到spring注入的bean,原因是过滤器初始化时spring容器还没初始化好,其实并不是。下面看一段代码:

在web.xml中定义过滤器:

<filter>
  <filter-name>demoFilter</filter-name>  
  <filter-class>xx.framework.filter.demoFilter</filter-class>
</filter>
<filter-mapping>  
<filter-name>demoFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

然后在过滤器的初始化方法init中:

@Override
public void init(FilterConfig filterConfig) throws ServletException {
    ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(filterConfig.getServletContext());
    RedisTemplate demoBean = (RedisTemplate)context.getBean("redisTemplate");
    System.out.println(demoBean);
 }

经过测试,此时是可以拿到spring中的redisTemplate 这个bean的,说明spring容器确实先于过滤器初始化的。那么回到过滤器中不能注入bean的问题,原因究竟是什么呢?可以看到,这里获取bean是通过applicationContext获取的,而不是直接注入的。

个人理解是:过滤器是servlet规范中定义的,并不归spring容器管理,也无法直接注入spring中的bean(会报错)。当然,要想通过spring注入的方式来使用过滤器也是有办法的,先在web.xml中定义:

<filter>
  <filter-name>DelegatingFilterProxy</filter-name> 
  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  <init-param>
    <param-name>targetBeanName</param-name>
    <param-value>demoFilter</param-value>
  </init-param>
  <init-param>
    <param-name>targetFilterLifecycle</param-name>
    <param-value>true</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>DelegatingFilterProxy</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

然后在spring容器中配置demoFilter这个bean:

<bean id="demoFilter" class="xx.framework.filter.demoFilter" />

在doFilter方法中可以获取到注入的bean了:

@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {
   System.out.println(redisTemplate.getClientList());
}

其中redisTemplate是通过@Resource注解注入进来的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java如何把逗号分隔的String字符串转int集合

    java如何把逗号分隔的String字符串转int集合

    这篇文章主要介绍了java实现把逗号分隔的String字符串转int集合,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • IDEA maven项目中刷新依赖的两种方法小结

    IDEA maven项目中刷新依赖的两种方法小结

    这篇文章主要介绍了IDEA maven项目中刷新依赖的两种方法小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • JavaFX 监听窗口关闭事件实例详解

    JavaFX 监听窗口关闭事件实例详解

    这篇文章主要介绍了JavaFX 监听窗口关闭事件实例详解的相关资料,需要的朋友可以参考下
    2017-05-05
  • Spring框架实现滑动验证码功能的代码示例

    Spring框架实现滑动验证码功能的代码示例

    之前项目需要在验证码模块,增加滑动验证码,用来给手机端使用的,大概看了下,主要方法就是将图片切割,然后记住偏移量,进行滑动,所以本文给大家介绍了Spring框架实现滑动验证码功能的方法示例,需要的朋友可以参考下
    2024-07-07
  • java程序员自己的图片转文字OCR识图工具分享

    java程序员自己的图片转文字OCR识图工具分享

    这篇文章主要介绍了java程序员自己的图片转文字OCR识图工具,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Java Mybatis查询数据库举例详解

    Java Mybatis查询数据库举例详解

    这篇文章主要给大家介绍了关于Java Mybatis查询数据库的相关资料,在MyBatis中可以使用递归查询实现对数据库中树形结构数据的查询,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • MyBatis拦截器:给参数对象属性赋值的实例

    MyBatis拦截器:给参数对象属性赋值的实例

    下面小编就为大家带来一篇MyBatis拦截器:给参数对象属性赋值的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • SpringBoot多环境切换的配置实现

    SpringBoot多环境切换的配置实现

    在日常的开发中,一般都会分好几种环境,本文就来介绍一下SpringBoot多环境切换的配置实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Java中BufferedReader和BufferedWriter使用方式

    Java中BufferedReader和BufferedWriter使用方式

    这篇文章主要介绍了Java中BufferedReader和BufferedWriter使用方式,FileWriter 类从 OutputStreamWriter 类继承而来,BufferedReader 类从字符输入流中读取文本并缓冲字符,以便有效地读取字符,数组和行
    2022-06-06
  • Java中使用While语句自增运算遍历数组典型实例

    Java中使用While语句自增运算遍历数组典型实例

    这篇文章主要介绍了Java中使用While语句自增运算遍历数组典型实例,本文直接给出实例代码,并对每一句代码都注解了详细注释,需要的朋友可以参考下
    2015-06-06

最新评论