在Filter使用@Autowired注解自动注入了mapper结果发现没有注入成功,mapper认为null,且使用的时候回报错
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
java.lang.NullPointerException: null
at com.qst.fk.java.conf.security.TokenAuthenticationFilter.successfulAuthentication(TokenAuthenticationFilter.java:154)
经查阅资料发现是web启动顺序的问题,启动顺序是listener->filter->servlet 当filter初始化时,注解的bean还没初始化,所以会初始化失败,导致为null
解决方案:
package com.qst.fk.java.util;
/**
* @author glq
* @create 2020-10-26 14:47
*/
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* 解决Filter中注入Bean失败
* Created by hoaven on 2018/5/30.
*/
@Slf4j
@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);
}
}
@Autowired
TLoginJournalMapper loginJournalMapper;
if(loginJournalMapper == null){
loginJournalMapper = (TLoginJournalMapper)SpringUtils.getBean(TLoginJournalMapper.class);
}
System.out.println(loginJournalMapper);
loginJournalMapper.insertSelective(loginJournal);