Util类调用Service中的方法报空指针异常
参考 原文链接:https://blog.csdn.net/Abby_lxf/article/details/107045853
起因是我想弄一个用户登录校验用户名是否重复的一个Util工具类,但发现在项目启动之后报错了
public class UserCheckUtils {
@Autowired
private UserMapper userMapper;
private static UserCheckUtils userCheckUtils;
public static boolean checkUsernameExist(String username){
boolean flag = false;
Map map = new ConcurrentHashMap();
map.put("username", username);
List list = userCheckUtils.userMapper.selectByMap(map);
if(list.isEmpty()){
flag = true;
}
return flag;
}
}
原因是 :Service注入失败
解决方法 :
- 保证util类当前所在的包在 SpringMVC 配置的扫描路径下
- 在工具类上加上 @Component 注解
- 使用 @PostConstruct 注解静态化当前工具类
- 调用Service时,使用静态化类调用
@PostConstruct注解:好多人以为是Spring提供的。其实是Java自己的注解。
Java中该注解的说明:**@PostConstruct该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。**PostConstruct在构造函数之后执行,init()方法之前执行。通常我们会是在Spring框架中使用到@PostConstruct注解 该注解的方法在整个Bean初始化中的执行顺序:Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)
实战:在静态方法中调用依赖注入的Bean中的方法。(一般都是这样使用的)
@Component
public class UserCheckUtils {
@Autowired
private UserMapper userMapper;
private static UserCheckUtils userCheckUtils;
@PostConstruct
public void init(){
userCheckUtils = this;
userCheckUtils.userMapper = this.userMapper;
}
public static boolean checkUsernameExist(String username){
boolean flag = false;
Map map = new ConcurrentHashMap();
map.put("username", username);
List list = userCheckUtils.userMapper.selectByMap(map);
if(list.isEmpty()){
flag = true;
}
return flag;
}
}