前言:需求是通过自定义注解,将用户登录后的通过微服务Feign获取到的数据直接注入到controller请求参数中,方便调用
1.自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
@Documented
@Inherited
public @interface LoginUser {
}
2.登录参数解析器
@Component
public class LoginUserArgumentResolver implements HandlerMethodArgumentResolver {
@Autowired
private UaaClient uaaClient;
/**
*声明拦截参数用的注解
*/
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(LoginUser.class);
}
/**
*返回注解拦截的参数内容
*/
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {
final Result<UserVo> currentUser = uaaClient.getCurrentUser();
Assert.notNull(currentUser.getData(), "请重新登录");
return currentUser.getData();
}
}
3.具体调用拦截方式,将数据注入到实体类参数中
/**
* 新增模型
*/
@ApiOperation(value = "新增模型")
@PostMapping()
public Result add(@RequestBody ModelVo modelVO, @LoginUser UserVo loginUser) {
modelService.add(modelVO, loginUser);
return Result.success("添加成功");
}
自定义注解详解
java中元注解(用来标识注解的注解)有四个: @Retention @Target @Document @Inherited;
@Retention:注解的保留位置
@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
@Target:注解的作用目标
@Target(ElementType.TYPE) //接口、类、枚举、注解
@Target(ElementType.FIELD) //字段、枚举的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR) //构造函数
@Target(ElementType.LOCAL_VARIABLE)//局部变量
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE) //包
@Document:说明该注解将被包含在javadoc中
@Inherited:说明子类可以继承父类中的该注解