java跨包使用ThreadLocal

在黑马商城微服务中,网关里的过滤器给Http请求加上了用户信息的请求头,发往后端服务,后端服务使用拦截器进行拦截,并取出用户信息,添加到ThreadLocal中。

使用拦截器获取用户信息的好处是不用在每个业务中写获取信息的代码,减少冗余。

黑马商城的每个微服务都引用了hm-common依赖,所以我们把拦截器定义在hm-common中。

下面是网关中过滤器的代码:

然后是拦截器:

拦截器要想生效,我们需要为拦截器写个配置类:

但此时拦截器并未生效。因为我们的服务与拦截器不在同一个包中,我们的服务扫描不到hm-common包,所以这时候我们要在resouces.META-INF.spring.factories中添加配置类所在的完整包名。

这样我们可以进行跨包扫描了,但此时还有个问题,我们重启网关服务之后报错:

“找不到WebMvcConfigurer.class这个类“,我们知道WebMvcConfigurer.class是属于SpringMvc的,但是我们的网关服务并不是基于SpringMvc的,网关服务并没有springmvc,但是网关的common依赖引用了SpringMVC的功能,所以我们需要开启SpringBoot装配的条件注解,判断一个类是否存在:

这样基于SpringMVC的服务有DispatcherServlet.class,那么这个配置类就生效,否则不生效。

这样我们就可以在业务代码中取到ThreadLocal中的值了。

但是我遇到了一个问题:

ThreadLocal取到的为null。

经过调试,发现在拦截器中并没有注入进ThreadLocal,原来是修改hm-common之后没有进行编译,重新编译hm-common,通过。

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值