一个坑,做个笔记,源于自己学艺不精。
基于springboot环境下整合redis的时候,遇到的问题:
在springboot环境下,拦截器中去获取redis的key数据的时候,发现无论怎么做都没办法获取到对应的key信息,直接空指针
在redis Manager下直接通过get命令是可以查到该值的,于是通过debug发现,在拦截器里的redis是null。
恰好网上搜到类似的情况,发现问题出在这里:因为拦截器这里是学习他人的写法,所以在未引入redis的时候,这里并没有
发现任何异常。加入redis之后,在调用拦截器就直接空指针了。
原因是在我的自定义拦截器里面已经注入了redis,然鹅在注册自定义拦截器的时候,addInterceptor方法那里用的是new方法
在spring中,我们的类已经交给框架管理了,一般来说不需要再手动new一个。貌似通过直接new的方式,对应类中的注入就失效
了。为了验证:因此写了一个小demo更清楚的展示。一个实体类:Audemo,注入到AuFunction中
在controller下调用AuFunction的getdemo方法,并且采用new的方式
结果:java.lang.NullPointerException: null
查看源码,在执行方法的时候,会去获取参数中的类对应的bean的,但是因为我这里没有注入,直接new
导致该类并未受到框架的管理,拿不到对应的bean,所以导致空指针异常。
于是简单改了一下:
再执行就正常打印了:
所以,拦截器这么写就能获取到redis实例了: