SpringBoot--過濾器注入bean的空指針問題


  在過濾器中的doFilterInternal寫業務代碼時,需要用到spring bean組件,發現在過濾器中無法初始化bean組件,均為NullPointerException,經檢查 掃描包路徑沒問題。最終確定容器加載順序引發的問題。在web.xml中各個元素的執行順序是這樣的,context-param-->listener-->filter-->servlet  可以看出在Spring MVC 的dispatcherservlet初始化之前過濾器就已經加載好了,所以注入的是null。

  紅箭頭標注的均為null對象

  解決思路是doFilterInternal使用spring上下文取獲取相應的bean組件,對於Spring Boot我們可以使用一下步驟來解決

  第一步:創建上下文工具類SpringContextUtil

 1 import org.springframework.context.ApplicationContext;
 2 
 3 public class SpringContextUtil {
 4     
 5     private static ApplicationContext applicationContext;
 6  
 7     //獲取上下文
 8     public static ApplicationContext getApplicationContext() {
 9         return applicationContext;
10     }
11  
12     //設置上下文
13     public static void setApplicationContext(ApplicationContext applicationContext) {
14         SpringContextUtil.applicationContext = applicationContext;
15     }
16  
17     //通過名字獲取上下文中的bean
18     public static Object getBean(String name){
19         return applicationContext.getBean(name);
20     }
21     
22     //通過類型獲取上下文中的bean
23     public static Object getBean(Class<?> requiredType){
24         return applicationContext.getBean(requiredType);
25     }
26  
27 }

  第二步:在Springboot啟動類的main方法中,向上下文工具類SpringContextUtil中注入applicationContext

1     public static void main(String[] args) throws InterruptedException {
2         ApplicationContext context = SpringApplication.run(Application.class, args);
3         SpringContextUtil.setApplicationContext(context);
4     }

  第三步:在相應的業務代碼中 使用SpringContextUtil.getBean("xxx") 獲取相應的bean組件即可,如:

1         JwtUtil jwtUtil = (JwtUtil) SpringContextUtil.getBean("jwtUtil");
2         UserLogMapper userLogMapper = (UserLogMapper) SpringContextUtil.getBean("userLogMapper");
3         JedisServer jedisServer = (JedisServer) SpringContextUtil.getBean("jedisServerImpl");

  經檢查:空指針問題解決。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM