新版SpringCloudGateway网关 切面修改方法入参
通过注解修改方法入参值,一般都是采用实现
org.springframework.web.method.support.HandlerMethodArgumentResolver 接口的
resolveArgument方法来做的
实现此接口之后,还需要另外创建一个bean来实现
WebMvcConfigurer 接口
添加参数解析器
但是由于springCloudGateway新版本 (2.2.x +)之后,似乎彻底移除除了spring-mvc系列的依赖包,导致这种切面方式不可用
(也不能手动添加spring-web....一些列的依赖到网关服务里,加上去启动报错)。
所以修改参数的切面只能使用@Aspect 注解达到切面效果
需要注意的是@Aspect注解只有@Around("pointCut()") 的方法可以改写入参,@Before以及其他几个拦截器无法返回参数
样例如下,将参数前使用@LoginUser的参数注入已经登录的相关信息。
切入点的公式可以直接复制,改下包名和自定义注解路径即可
@Aspect @Component public class LoginUserAspect { @Autowired private AuthFeign authFeign; // 配置织入点 @Pointcut("execution(public * com.xqoo..*(.., @com.xqoo.feign.annotations.LoginUser (*), ..))") public void pointCut() { } @Before("pointCut()") public void beforeMethod(JoinPoint joinPoint) { } @Around("pointCut()") public Object around(ProceedingJoinPoint pjp) throws Throwable { Object returnModel; //获取请求头 HttpServletRequest request = ServletUtils.getRequest(); String token = request.getHeader(SystemPublicConstant.AUTH_HEADER_KEY_NAME); //获取目标方法的参数信息 Object[] obj = pjp.getArgs(); for (int i = 0; i < obj.length; i++) { if (obj[i] instanceof CurrentUser) { if(StringUtils.isEmpty(token)){ obj[i] = new CurrentUser(); break; } obj[i] = FeignReturnDataGzip.Unzip(authFeign.getLoginUserInfo(token), CurrentUser.class); break; } } returnModel = pjp.proceed(obj); return returnModel; } }
springCloudGateway 版本 2.2.5,springBoot版本不受影响,依然可以添加spring-web系列依赖
上一篇:
IDEA上Java项目控制台中文乱码