springboot 中一个空指针的错误提示:
2019-03-25 11:26:25.769 ERROR 8896 --- [nio-8680-exec-1] o.a.c.c.C.[.[.[.[dispatcherServlet] :Servlet.service() for servlet [dispatcherServlet] in context with path /ding threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException: null
at jlsky.auth.AuthInterceptor.preHandle(AuthInterceptor.java:55) ~[classes/:na]
(省略余下的 tomcat的各种提示信息。)
事情是这样的,参照 https://www.jianshu.com/p/e88d3f8151db 做了个自定义注解和拦截器的权限模块。但是一运行到 @Autowired 注入的方法就报错。
拦截器的部分代码如下:
public class AuthInterceptor implements HandlerInterceptor {
@Autowired RoleConfirmImpl roleConfirm;
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse resp,Object obj) throws ResultException {
String token = req.getHeader("token"); // 从请求中获取 token
if(!(obj instanceof HandlerMethod)){ //如果不是映射到方法,直接通过。
return true;
}
HandlerMethod handlerMethod = (HandlerMethod) obj;
Method method = handlerMethod.getMethod();
//检查有没有需要验证用户授权的注解
if(method.isAnnotationPresent(AuthToken.class)){
AuthToken authToken = method.getAnnotation(AuthToken.class);
if(authToken.required()){
//执行认证
if(token == null){
throw new ResultException(ResultCode.LOGIN_NOTOKEN);
}
//verify token,获取 token中的 userid
int userid = JwtUtil.verifyUserId(token);
log.info("userid: "+ userid);
roleConfirm.belong(userid,authToken.role());
return true;
}else{
return false;
}
}
return true; //没有应用注解的访问,许可通过。
}
起初,是通过接口间接访问的方法。去掉接口这个环节,问题依旧。
再后来在方法上添加了 static 解决问题。
(如果在接口的方法上加 static,那么就需要直接写方法体,也就失去了定义接口意义。)
虽然问题解决了,但是总觉得这个方法有点LOW。其实我也尝试了加注解或者放到main方法定义的扫描路径下,都不行。