在過濾器中的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");
經檢查:空指針問題解決。