1.创建自定义注解
@Documented
@Target({ ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface UserInfo {
String columnName() default "";
}
参数解析:
(1)Target:当前注解使用的位置。
(2) Retention:注解使用范围
(3)Documented:使用使用在java doc文档
2.实现注解(通过实现HandlerMethodArgumentResolver 自定义解析工具)具体实现resolveArgument 改方法
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
Subject subject = SecurityUtils.getSubject();
if (!subject.isAuthenticated())
return null;
UserInfo cuser = parameter.getParameter().getAnnotation(UserInfo.class);
if (cuser == null)
return null;
Class<?> klass = parameter.getParameterType();
User lu = (User) subject.getPrincipal();
if (lu == null) {
return null;
}
//获取当前注解参数的类型!
if (klass.isAssignableFrom(User.class)) {
return lu;
}
if(klass.isAssignableFrom(String.class)){
String name = StringUtils.isNotBlank(cuser.columnName()) ? cuser.columnName() : parameter.getParameterName();
userColumns.get(name).setAccessible(true);
String result = (String) userColumns.get(name).get(lu);
if(result!=null)
return result;
return null;
}
return null;
}
为注解参数进行字段匹配:
public MyHandlerMethodArgumentResolver() {
//指定当前注解 注入的类型 user 或则user对象的属性
Stream.of(User.class.getDeclaredFields()).forEach(f -> {
userColumns.put(f.getName(), f);
});
}
private Map<String, Field> userColumns = new HashMap<>();