在springboot中攔截器Filter中注入bean失敗問題及解決
緣由
在做SSO項目時整合了shiro,在寫一個攔截器的時候(繼承AccessControlFilter)在這里需要注入一個Bean.
按正常的寫法如下:
@Autowired private RedisUtil<Object, Object> redisUtil;
這是我的一個操作redis的工具類。
這樣自動去注入當(dāng)使用的時候是未NULL,是注入不進去了。
通俗的來講是因為攔截器在spring掃描bean之前加載所以注入不進去。
解決方法
可以通過已經(jīng)初始化之后applicationContext容器中去獲取需要的bean.
public <T> T getBean(Class<T> clazz,HttpServletRequest request){ WebApplicationContext applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext()); return applicationContext.getBean(clazz); }
可以直接調(diào)用此方法得到想要的Bean
RedisUtil<String,Object> redisUtil = getBean(RedisUtil.class, request);
這樣就可以直接使用了。
注意*****
如果有其他配置類中有new 一個對象出來,這個對象是不會被springboot管理的,不管你在其他地方用什么方法去交給spring管理創(chuàng)建對象,怎么都會注入為null,所以怎么注入都為null時注意檢查手動new的地方 !!!
錯誤示例
SocketChannelInterceptor 這個對象是不會被spring管理的。 @Override public void configureClientInboundChannel(ChannelRegistration registration) { registration.interceptors( new SocketChannelInterceptor()); } @Override public void configureClientOutboundChannel(ChannelRegistration registration) { registration.interceptors( new SocketChannelInterceptor()); }
正確示例
@Bean public SocketChannelInterceptor getSocketChannelInterceptor(){ return new SocketChannelInterceptor(); } @Override public void configureClientInboundChannel(ChannelRegistration registration) { registration.interceptors( getSocketChannelInterceptor()); } @Override public void configureClientOutboundChannel(ChannelRegistration registration) { registration.interceptors( getSocketChannelInterceptor()); }
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java 根據(jù)網(wǎng)絡(luò)URL獲取該網(wǎng)頁上面所有的img標(biāo)簽并下載圖片
這篇文章主要介紹了Java 根據(jù)網(wǎng)絡(luò)URL獲取該網(wǎng)頁上面所有的img標(biāo)簽并下載圖片,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-11-11Spring中的@ExceptionHandler異常攔截器
這篇文章主要介紹了Spring中的@ExceptionHandler異常攔截器,Spring的@ExceptionHandler可以用來統(tǒng)一處理方法拋出的異常,給方法加上@ExceptionHandler注解,這個方法就會處理類中其他方法拋出的異常,需要的朋友可以參考下2024-01-01SpringBoot+WebSocket+Netty實現(xiàn)消息推送的示例代碼
這篇文章主要介紹了SpringBoot+WebSocket+Netty實現(xiàn)消息推送的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04使用IDEA啟動項目遇見ClassNotFoundException的解決方案
這篇文章主要介紹了使用IDEA啟動項目遇見ClassNotFoundException的正確解決方案,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06SpringBoot測試之@SpringBootTest與MockMvc的實戰(zhàn)應(yīng)用小結(jié)
本文將深入探討SpringBoot測試中兩個核心工具:@SpringBootTest注解與MockMvc測試框架的實戰(zhàn)應(yīng)用,幫助開發(fā)者構(gòu)建更穩(wěn)健的測試體系,提高代碼質(zhì)量與可維護性,感興趣的朋友一起看看吧2025-03-03java8新特性 stream流的方式遍歷集合和數(shù)組操作
這篇文章主要介紹了java8新特性 stream流的方式遍歷集合和數(shù)組操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08