Field injection is not recommended
**Servlet.service() for servlet [dispatcherServlet] in context with path [] th
Field injection is not recommended**
- 最近在做一个整合shiro+jwt的项目,在做到拦截器实现myRealm自动登录
- 继承AuthenticatingFilter,重写onAccessDenied方法
- 本来打算就是在拦截器进行token的验证有效性,但是我拿的这个token验证有效性是封装好的,看下面
// Token过期时间30分钟(用户登录过期时间是此时间的两倍,以token在reids缓存时间为准)
public static final long EXPIRE_TIME = 30 * 60 * 1000;
/**
* 校验token是否正确
*
* @param token 密钥
* @param secret 用户的密码
* @return 是否正确
*/
public static boolean verify(String token, String username, String secret) {
try {
// 根据密码生成JWT效验器
Algorithm algorithm = Algorithm.HMAC256(secret);
JWTVerifier verifier = JWT.require(algorithm).withClaim("username", username).build();
// 效验TOKEN
DecodedJWT jwt = verifier.verify(token);
return true;
} catch (Exception exception) {
return false;
}
}
我一直以为的是我@Autowired注入有问题,因为上面有idea的提示说不建议这样使用,重名就会出问题,在开始我是带着这个问题去找答案,建议的是用@Resource,我后面改成@Resource还是这个问题
事实证明在springboot4.0以后,都建议的使用@Resource
@Autowired:根据类型去找,如果有多个实现了,就会发生冲突,抛出异常
@Resource:是根据bean的名称去寻找,找不到再去匹配类型
后面在跑的时候,也还是出现这个问题,我就带着问题百度看大佬们的回答
结果如下:
我认为的是第二条是对于我的这个问题的方向是正确的,然后我接着去查他们的执行顺序
context-param–>listener–>filter–>servlet–>interceptor(拦截器)
所以无论怎么样,初始化都得到的值就是null,所以就得通过WebApplicationContext去获取我们的服务类,如图:
/**
* 因为spring加载bean在拦截器之后,所以在这里注入是无法获得,会报空指针异常
* 所以需要用WebApplicationContext来获取service类对象
*/
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext());
UserService bean = wac.getBean(UserService.class);
System.out.println("从WebApplicationContext里去获取的service"+bean);
走到这里了,就能够在拦截器的时候去获取我们需要的对象。
后续就能够成功的在拦截器调用我们的服务层去进行测试啦
参考链接:https://www.it610.com/article/1297505587197714432.htm