在学习商品甄选项目的时候,当时我的解决方案是在登录的时候存入用户数据
由于懒得看视频 最后才发现 文档最后才给了这个解决方案。。。。
问题说明
在测试的时候,那么service-cart微服务会报错,如下所示:
java.lang.NullPointerException: Cannot invoke "com.atguigu.spzx.model.entity.user.UserInfo.getId()" because the return value of "com.atguigu.spzx.common.util.AuthContextUtil.getUserInfo()" is null at com.atguigu.spzx.cart.service.impl.CartServiceImpl.getAllCkecked(CartServiceImpl.java:147)
针对service-cart微服务是获取不到当前登录用户的信息。
原因:service-order微服务调用service-cart微服务的时候,是通过openFeign进行调用,openFeign在调用的时候会丢失请求头
1.6.2 问题解决
解决方案:使用feign拦截器拦截请求,获取token,重新传递token
注意:为了让feign拦截器更加通用,那么此时可以将拦截器定义到common-service模块中
feign拦截器开发:
-
1、在common-service模块中加入openFeign的依赖
<!-- openfeign依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <scope>provided</scope> </dependency>
-
2、定义feign拦截器
// com.atguigu.spzx.common.feign; public class UserTokenFeignInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate requestTemplate) { ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = requestAttributes.getRequest(); String token = request.getHeader("token"); requestTemplate.header("token" , token) ; } }
-
3、定义使用该拦截器的注解
// com.atguigu.spzx.common.anno; @Retention(value = RetentionPolicy.RUNTIME) @Target(value = ElementType.TYPE) @Import(value = UserTokenFeignInterceptor.class) public @interface EnableUserTokenFeignInterceptor { }
-
4、service-order微服务启动类上使用@EnableUserTokenFeignInterceptor注解