有时候会遇到这种需求:要从web请求头中获取信息给业务方法调用,虽然可以手动在方法中获取参数值,但如果多个方法获取的参数都一样,可以考虑抽象出一个注解统一处理。
定义一个方法注解
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface HeaderResolver{
}
定义一个处理该注解的切面
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
@Aspect
@Component
public class HeaderResolverAspect {
@Around("@annotation(headerResolver)")
public ReturnType around(ProceedingJoinPoint proceedingJoinPoint, HeaderResolver headerResolver) throws Throwable {
//获取请求头中的参数值
String loginUserId = ServletRequestAttributes.class.cast(RequestContextHolder.getRequestAttributes())
.getRequest()
.getHeader("loginUserId");
//方法入参
Object inParam = proceedingJoinPoint.getArgs()[0];
//反射获取入参bean的字段
Field field = inParam.getClass().getDeclaredField("userId");
field.setAccessible(true);
//设置值
field.set(inParam,loginUserId);
//继续调用方法本体执行
return ReturnType.class.cast(proceedingJoinPoint.proceed());
}
}
使用示例
@ApiOperation("示例")
@GetMapping("/demo")
@HeaderResolver
public ReturnType list(@Validated DemoDTO demoDTO){
return demoService.list(demoDTO);
}