问题: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: 有什么不清楚的可以评论哦。
才疏学浅 ,请多指教 !