Spring中的Interceptor拦截器中使用@Autowired注解,在运行时会出现空指针

问题描述

我们一般在拦截器中会写一些逻辑处理,比如获取用户的登录信息,将信息存入ThreadLocal等等。
而获取用户信息的时候就有多种方式了。
比如:在session中获取,或者使用token去redis中获取。
这个问题就是使用token去redis中获取用户信息的时候遇到的。因为在获取时需要使用@Autowired将StringRedisTemplate注入。此时运行就遇到了空指针错误。

原因分析

原因:因为拦截器在其配置类里是使用new创建的,而使用new创建的类就不归spring管理了,所以在里面使用@Autowired也将报错。
配置类代码如下:

1 @Configuration
2 public class WebMvcConfig implements WebMvcConfigurer {
3     @Override
4     public void addInterceptors(InterceptorRegistry registry) {
5         registry.addInterceptor(new CustomerInterceptor()).addPathPatterns("/customer/**");
6         registry.addInterceptor(new ManageInterceptor()).addPathPatterns("/manage/**");
7
8     }
9 }

解决方案:

方案一:

将拦截器类中添加@Component注解,然后在WebMvcConfigure类中使用@Autowird,将拦截器对象注入进来
代码如下:

1 @Component
 2 public class CustomerInterceptor extends HandlerInterceptorAdapter {
 3     @Autowired
 4     private StringRedisTemplate stringRedisTemplate ;
 5     @Override
 6     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
 7         String token = request.getHeader("accessToken");
 8         if (token == null){
 9             PrintWriter out = response.getWriter();
10             out.print(JSON.toJSON(ResultUtil.error("请进行登录")));
11             return false;
12         }
13         if (TokenUtils.verify(token)){
14             JSONObject object = JSONObject.fromObject(stringRedisTemplate.opsForValue().get(token));
15
16             CustomerVo msg = (CustomerVo)JSONObject.toBean(object, CustomerVo.class);
17
18             CustomerThreadLocal.set(msg);
19             if (msg!=null){
20                 return true;
21             }
22         }
23         return false;
24     }
25
26     @Override
27     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
28
29     }
30
31     @Override
32     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
33
34     }
35 }
1 @Configuration
 2 public class WebMvcConfig implements WebMvcConfigurer {
 3     @Autowired
 4     CustomerInterceptor customerInterceptor;
 5     @Autowired
 6     ManageInterceptor manageInterceptor;
 7     @Override
 8     public void addInterceptors(InterceptorRegistry registry) {
 9         registry.addInterceptor(customerInterceptor).addPathPatterns("/customer/**");
10         registry.addInterceptor(manageInterceptor).addPathPatterns("/manage/**");
11
12     }
13 }

方案二:

无需在拦截器类上添加@Component直接,直接在WebMvcConfigure类中添加经由@Bean注解的返回拦截器对象的方法。
代码:

1 @Configuration
 2 public class WebMvcConfig implements WebMvcConfigurer {
 3
 4     @Bean
 5     public CustomerInterceptor customerInterceptor(){
 6         return new CustomerInterceptor();
 7     }
 8     @Bean
 9     public ManageInterceptor manageInterceptor(){
10         return new ManageInterceptor();
11     }
12     @Override
13     public void addInterceptors(InterceptorRegistry registry) {
14         registry.addInterceptor(customerInterceptor()).addPathPatterns("/customer/**");
15         registry.addInterceptor(manageInterceptor()).addPathPatterns("/manage/**");
16
17     }
18 }

Original: https://www.cnblogs.com/fnlingnzb-learner/p/16448572.html
Author: Boblim
Title: Spring中的Interceptor拦截器中使用@Autowired注解,在运行时会出现空指针

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/541622/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 总结Hibernate4.1+版本与Hibernate3.3+版本区别

    利用休假时间好好学习了当今流行的ORMapping框架- Hibernate,看完了马士兵老师经典的Hibernate视频教程,也算是小小入门了吧。 马老师在讲课中使用的Hiber…

    Java 2023年6月9日
    066
  • PHP上传文件类型检查

    Original: https://www.cnblogs.com/wxweven/archive/2012/11/13/2768410.htmlAuthor: wxwevenTi…

    Java 2023年6月9日
    067
  • 维基动漫

    维基动漫 软件支持右键详情页预览,右键删除收藏列表等功能 ① 3.0.1 增加界面右下方引擎切换功能,切换引擎可能会比较慢。 软件版本更新V3.0.1:(替换原路径即可) 链接: …

    Java 2023年5月30日
    075
  • IO(finally关键字的特点及作用)

    finally的特点 finally:被finally控制的语句体一定会执行* 注意:如果在执行到finally之前jvm退出了,就不能执行了。** A:格式* try&#8230…

    Java 2023年6月5日
    080
  • JUC锁:核心类AQS源码详解

    1 疑点todo和解疑 2 AbstractQueuedSynchronizer学习总结 2.1 AQS要点总结 2.2 细节分析 2.2.1 插入节点时先更新prev再更新前驱n…

    Java 2023年6月7日
    0119
  • Spring知识点总结篇2 AOP

    AOP 的过程? Spring AOP 由 BeanPostProcessor 后置处理器开始,这个后置处理器可以监听容器触发的 Bean 生命周期事件,向容器注册后置处理器以后,…

    Java 2023年6月6日
    078
  • java 入门如何设计类

    2019/12/24 | 在校大二上学期 | 太原科技大学 初学java后,我们会发现java难点不在于Java语法难学,而是把我们挂在了如何设计类的”吊绳&#8221…

    Java 2023年6月9日
    078
  • 1. 什么是微服务 ?

    1 . 什么是微服务 ? 微服务主要有两个关键词 : 微和服务 服务 : 实现某种业务逻辑的模块或应用 微 : 望文生义,就是小的意思 SOA(service-oriented a…

    Java 2023年6月8日
    088
  • 160_SpringBoot案例-topic主题模式

    整体核心 目标 实现步骤 生产者 创建生产者工程:springboot-rabbitmq-topic-producer 在pom.xml中引入依赖 在application.yml…

    Java 2023年6月7日
    088
  • [JVM] JVM的类加载机制

    JVM的类加载 首先我们来看下 Java虚拟机的类加载过程: 如上图。 当 JVM需要用到某个类的时候,虚拟机会加载它的 .class 文件。加载了相关的字节码信息之后,会常见对应…

    Java 2023年6月5日
    069
  • 设计模式之代理模式

    代理模式属于结构型模式,代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用,即通过代理对象访问目标对象。这样做的好处是:可以在目标对象实现的基础上,增强额外的功能…

    Java 2023年6月5日
    083
  • git 版本控制命令笔记

    git 获取与创建项目 你得先有一个git仓库,才能用它进行操作。仓库是Git存放你要保存的快照的地方。 创建仓库的两种方式: init 通过命令行初始化。 clone 如果我们想…

    Java 2023年6月8日
    086
  • Java 注解

    Java的注解是个很神奇的东西,它既可以帮你生成代码,又可以结合反射来在运行时获得注解标识的对象,进行逻辑处理,它能帮助我们完成很多很多不可能完成的任务,这回我们就来一起来了解下它…

    Java 2023年5月29日
    091
  • Java基础第一天

    一、Java基础语法 由美国sun公司在1995年推出的Java语言 Java之父:詹姆斯·高斯林 Java发展史:2004年Java5.0(Java里程碑),2009年被Orac…

    Java 2023年6月15日
    076
  • 对象的内存布局解析

    概念说明 Hotspot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据 (Instance Data)和对齐填充(Padding)。 * &#8…

    Java 2023年6月16日
    085
  • 分布式session的解决方法

    一、背景 上篇博客,使用微博社交登录谷粒商城后,将用户信息保存在session中,此时进入到谷粒商城的任何页面都需要能够取到用户信息, 谷粒商城首页(gulimall.com/in…

    Java 2023年5月30日
    076
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球