



下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第在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-namedemoFilter/filter-name
filter-classxx.framework.filter.demoFilter/filter-class
/filter
filter-mapping
filter-namedemoFilter/filter-name
url-pattern/*/url-pattern
/filter-mapping
然后在过滤器的初始化方法init中:
@Override
publicvoidinit(FilterConfigfilterConfig)throwsServletException{
ApplicationContextcontext=WebApplicationContextUtils.getWebApplicationContext(filterConfig.getServletContext());
RedisTemplatedemoBean=(RedisTemplate)context.getBean("redisTemplate");
System.out.println(demoBean);
}
经过测试,此时是可以拿到spring中的redisTemplate这个bean的,说明spring容器确实先于过滤器初始化的。那么回到过滤器中不能注入bean的问题,原因究竟是什么呢?可以看到,这里获取bean是通过applicationContext获取的,而不是直接注入的。
个人理解是:过滤器是servlet规范中定义的,并不归spring容器管理,也无法直接注入spring中的bean(会报错)。当然,要想通过spring注入的方式来使用过滤器也是有办法的,先在web.xml中定义:
filter
filter-nameDelegatingFilterProxy/filter-name
filter-classorg.springframework.web.filter.DelegatingFilterProxy/filter-class
init-param
param-nametargetBeanName/param-name
param-valuedemoFilter/param-value
/init-param
init-param
param-nametargetFilterLifecycle/param-name
param-valuetrue/param-value
/init-param
/filter
filter-mapping
filter-nameDelegatingFilterProxy/filter-name
url-pattern/*/url-pattern
/filter-mapping
然后在spring容器中配置demoFilter这个bean:
beanid="demoFilter"/
在doFilter方法中可以获取到注入的bean了:
@Override
publicvoiddoFilter(ServletRequestreq,ServletResponseresp,FilterChainfilterChain)throwsIOException,ServletException{
Sy
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论