問題:filter裏面需要查詢數據庫,於是注入了service類,但是發現根本注入不了,報了空指針異常
解決:在網上看是:我建立一個全局攔截器,當然,我把它命名爲LoginFilter,它繼承了Filter,web應用啓動的順序是:listener->filter->servlet,而因爲項目應用了spring mvc,所以我們會有一個配置文件(applixationContext.xml),我們在配置spring時會用到spring的listener,它會讀取application.xml裏的配置對spring context進行初始化;項目啓動時,先初始化listener,因此配置在applicationContext.xml裏的bean會被初始化和注入;然後再來就filter的初始化,再接着纔到我們的dispathServlet的初始化,因此,當我們需要在filter裏注入一個註解的bean時,就會注入失敗,因爲filter初始化時,註解的bean還沒初始化,沒法注入。
一堆!!沒毛病(相信大家在看到我這篇之前,就已經看了,但是看完了,沒解決,,可以試下我的方法 O(∩_∩)O!)
一:先在Filter 添加bean;工具類:SpringUtils
注意:此工具類必須在filter文件夾下(下圖所示)
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* @author yqb
* @date 2018年9月29日
* @version 1.0
*/
@Component
public class SpringUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
if (SpringUtils.applicationContext == null) {
SpringUtils.applicationContext = applicationContext;
}
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
//根據name
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
//根據類型
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
}
二:在LoginFilter中添加:
@Autowired
private AdminUserService adminUserService;
添加bean,命名可以自定
if (adminUseService == null) {
adminUserService = (AdminUserService) SpringUtils.getBean("adminUserService");
}
三:在 配置文件(applixationContext.xml)配置下包名
<context:component-scan
base-package="com.ong.controller,
com.ong.service,
com.ong.filter">
</context:component-scan>
之前配置了controller和service,,,filter於controller和service是同級包,,
LoginFilter.java在包filter下,然後我們就可以調用userService中的方法了:
JSONObject data =userService.userLogin(userName,passWord);
參考:https://blog.csdn.net/Evan_QB/article/details/82894834
https://blog.csdn.net/chl191623691/article/details/78657638
ps: 有什麼不清楚的可以評論哦。
才疏學淺 ,請多指教 !