赞
踩
前言:需求是通过自定义注解,将用户登录后的通过微服务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:说明子类可以继承父类中的该注解
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。