Springboot项目中,想要通过security实现登录,本人需求是除了用户名和密码,还有第三个额外的参数,网上找到的一个项目只有默认的用户名和密码,网上的解决办法是自定义filter来验证。。然后遇上一个问题,在利用@Autowired注入mapper时,出现空指针错误,原因是:
web应用启动的顺序是:listener->filter->servlet,而因为项目应用了SpringBoot,所以我们项目启动时,先初始化listener,因此注解的bean会被初始化和注入;然后再来就filter的初始化,再接着才到我们的dispathServlet的初始化,因此,当我们需要在filter里注入一个注解的bean时,就会注入失败,因为filter初始化时,注解的bean还没初始化,没法注入。
解决办法:
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);
}
}
转自:https://blog.youkuaiyun.com/qq_41835640/article/details/109289877