解决SSM项目中Filter无法注入Service问题

解决SSM项目中Filter无法注入Service问题

在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

<select id="selectUserById" resultType="com.lqqgust.entity.User">
    select * from user where id = #{userId}
</select>

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查库的对象了

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值