通过注解修改方法入参值,一般都是采用实现
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系列依赖