对于springboot 的拦截器中redisTemplate 为null 解决办法

一、问题?

这两天遇到SpringBoot拦截器中Bean无法注入问题。下面介绍我的思考过程和解决过程
基于springboot项目下我们很容易想到结合redis做的分布式拦截,把用户登录或者需要验证的信息放到redis里面。
但是在写拦截器的时候发现redisTemplate一直无法注入进来,
最后查资料才发现springboot拦截器是在Bean实例化之前执行的,所以Bean实例无法注入。

二、复原问题代码

先看下问题,新建一个拦截器,然后注入redisTemplate
2.1 先看段代码,能发现有什么问题?
  • webConfig
/**
 * @program: onion
 * @description: webConfig
 * @author: Mr.Teddy
 * @create: 2020-09-04 09:33
 **/
@Configuration
public class WebConfig implements WebMvcConfigurer {

    /**
     * 这里需要先将限流拦截器入住,不然无法获取到拦截器中的redistemplate
     * @return
     */
    @Bean
    public TokenValidateInterceptor getAccessLimitIntercept() {
        return new TokenValidateInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry){
                registry.addInterceptor(getAccessLimitIntercept()) //添加拦截器
                .addPathPatterns("/**") //拦截所有请求
                .excludePathPatterns("/swagger-ui.html") //接口文档
                .excludePathPatterns("/swagger-ui.html/**")
                .excludePathPatterns("/swagger-resources/**")
                .excludePathPatterns("/webjars/**");
    }
}
  • 拦截器
/**
 * @program: teddy_manage
 * @description: 拦截器
 * @author: Mr.Teddy
 * @create: 2020-10-19 14:40
 **/
@Slf4j
public class TokenValidateInterceptor extends HandlerInterceptorAdapter {

 	@Resource
	private RedisTemplate redisTemplate;	// 注入redis
	
	@Override
  	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
		...
		log.info("--------------处理请求前---------------");
	}
	
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object o, ModelAndView modelAndView) {
      log.info("--------------处理请求完成后视图渲染之前的处理操作---------------");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) {
      log.info("---------------视图渲染之后的操作-------------------------0");
    }
2.2 哈哈哈,看不出来什么毛病吧? 来看代码结果

在这里插入图片描述

原因是由于拦截器加载的时间点在springcontext之前,所以在拦截器中注入为null。

三、解决办法

知道拦截器执行在bean实例化前执行的,那么我们就让拦截器执行的时候实例化拦截器Bean,在拦截器配置类里面先实例化拦截器,然后再获取

  • 在WebMvcConfigurer的实现类中给容器实例化拦截器就解决啦。

在这里插入图片描述

😁 作者:Teddy (公众号:鸡仓故事汇)
ok!到这里就大功告成,小编(Teddy)在这里先感谢大家的到来。
虽然不是太详细,小编已经很努力,给小编来个一键三连(点赞,关注,收藏),小编会越来越努力。。。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值