在Filter中不能注入bean的問題及解決
Filter中不能注入bean的問題
WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext()); ApiController apiController = (ApiController) webApplicationContext.getBean("apiController");
Filter中注入bean 無效為null
問題原因
Web應(yīng)用的啟動順序是:
Lisenter->Fliter->Servlet, 應(yīng)用程序上下文, 初始化 Fliter的時(shí)候,還沒有初始化Servlert,所有沒有進(jìn)入DispacterServlet的初始化,故在Fliter中使用注解注入bean為空;
解決辦法
添加初始化bean配置,手動創(chuàng)建對象new
代碼如下:
package com.test.config; import com.alibaba.druid.support.http.StatViewServlet; import com.test.service.RequestFilter; import javax.servlet.Filter; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.filter.DelegatingFilterProxy; /** * @author lucasliang * @date 08/11/2018 5:56 afternoon filter load before dispathServlet ,so load RequestFilter as a * bean,new a RequestFilter */ @Configuration public class FilterConfig { /* *@param: [] *@return javax.servlet.Filter *@author lucasliang *@date 20/12/2018 *@Description filter */ @Bean public Filter uploadFilter() { return new RequestFilter(); } /* *@param: [] *@return org.springframework.boot.web.servlet.FilterRegistrationBean *@author lucasliang *@date 20/12/2018 *@Description filter */ @Bean @SuppressWarnings("unchecked") public FilterRegistrationBean testFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new DelegatingFilterProxy("uploadFilter")); registration.addUrlPatterns("/*"); registration.addInitParameter("paramName", "paramValue"); registration.setName("testFilter"); registration.setOrder(1); registration.setEnabled(false); return registration; } }
其中RequestFilter是手動創(chuàng)建的bean,實(shí)現(xiàn)了Filter接口
package com.test.service; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; public class RequestFilter implements Filter { private Logger logger = LoggerFactory.getLogger(Filter.class); @Value(value = "${encodeRules}") private String encodeRules; }
此時(shí),在RequestFilter中使用@Value注解,就可以取到值了,注入bean也相同,會取到對應(yīng)的bean。
至此問題解決!
總結(jié):不管做什么事,首先要搞清楚他的原理,要不,解決了問題下次遇到了還是不會!
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot Actuator的指標(biāo)監(jiān)控可視化功能詳解
SpringBoot Actuator是springboot為簡化我們對微服務(wù)項(xiàng)目的監(jiān)控功能抽取出來的模塊,使得我們每個(gè)微服務(wù)快速引用即可獲得生產(chǎn)界別的應(yīng)用監(jiān)控、審計(jì)等功能。這篇文章主要介紹了springboot Actuator的指標(biāo)監(jiān)控可視化,需要的朋友可以參考下2021-08-08Spring實(shí)戰(zhàn)之使用Resource作為屬性操作示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之使用Resource作為屬性,結(jié)合實(shí)例形式分析了spring載人Resource作為屬性相關(guān)配置與使用技巧,需要的朋友可以參考下2020-01-01Java實(shí)現(xiàn)合并word文檔的示例代碼
在做項(xiàng)目中,經(jīng)常會遇到一種情況,需要將一個(gè)小word文檔的內(nèi)容插入到一個(gè)大word(主文檔)中。本文就為大家準(zhǔn)備了Java實(shí)現(xiàn)合并word文檔的方法,需要的可以參考一下2022-08-08Java使用Condition控制線程通信的方法實(shí)例詳解
這篇文章主要介紹了Java使用Condition控制線程通信的方法,結(jié)合實(shí)例形式分析了使用Condition類同步檢測控制線程通信的相關(guān)操作技巧,需要的朋友可以參考下2019-09-09Spring Security自定義登錄原理及實(shí)現(xiàn)詳解
這篇文章主要介紹了Spring Security自定義登錄原理及實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09