在ssm项目整合的过程中遇到了一个问题,就是在Filter中注入Service服务的时候,在调用的过程中控制台报了个空指针,显示我的userservice找不到对象。
LoginFilter
String token = request.getHeader("token"); if(StringUtils.hasText(token)){ DecodedJWT decodedJWT = TokenUtils.getToken(token); Integer id = decodedJWT.getClaim("id").asInt(); String name = decodedJWT.getClaim("name").asString(); User user = userService.selectUserById(id); if(name.equals(user.getName())){ filterChain.doFilter(servletRequest,servletResponse); } else{ map.put("msg","校验失败!"); map.put("state",false); String json = new ObjectMapper().writevalueAsString(map); response.setContentType("application/json;charset=UTF-8"); response.getWriter().println(json); }排查思路:
1.从空指针来看初步考虑,uservice调的selectUserById方法查找对象失败,于是判断是id没传进来,还是因为Dao层的SQL写错。
经过断点排查,sql没有写错。
UserMapper.xml
2.既然Dao层没问题,初步考虑id没传进来
经过断点调试,id的确传进来了
3.既然Dao层与参数传值没问题,考虑和web应用启动的顺序有关,web应用程序启动的顺序是:listener—>filter—>servlet
首先web先启动listener也就是监听器,然后才到filter的初始化,最后到SpringMVC的dispathServlet的初始化。所以当我们需要在过滤器中注入我们的Service服务的时候就会注入失效,因为注解在filter的时候还没进行初始化,所以会导致无法注入的情况。最终出现控制台报空指针bug。
@Autowired private UserService userService;解决方案:
通过Spring框架提供的工具类SpringBeanAutowiringSupport,主要用来对Spring web applicationcontext 提供@Autowired注入服务。
简单来说,在Filter中的init方法中调用SpringBeanAutowiringSupport.processInjectionbasedonServletContext(this,filterConfig.getServletContext());,就可以直接使用@Autowired来注入Service服务了。
@Override public void init(FilterConfig filterConfig) throws ServletException { //由于web应用启动的顺序是:listener>filter>servlet 所以才filter初始化的时候手动添加SpringBean支持。 SpringBeanAutowiringSupport.processInjectionbasedOnServletContext(this,filterConfig.getServletContext()); }
最终拿到Service查库的对象了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)