一、场景
搭建框架的时候踩到的一个坑。spring boot项目,项目中用到了AOP记录Log,又用到了拦截器判断权限和记录系统log到表中,于是在拦截器中需要
HandlerMethod handlerMethod = (HandlerMethod) handler;
获取类注解和方法注解,但是获取的类注解是null,源码如下:
// 获取类注解
Class<? extends Object> clazz = handlerMethod.getBean().getClass();
CategoryLog categoryLog = AnnotationUtils.findAnnotation(clazz, CategoryLog.class);
if (Objects.isNull(categoryLog)) {
return;
}
String menu = categoryLog.menu();
// 获取方法注解
Method method = handlerMethod.getMethod();
DescLog descLog = method.getAnnotation(DescLog.class);
if (Objects.isNull(descLog)) {
return;
}
二、原因分析
是由于上述代码我们所需要获取的类首先被AOP拦截生成了代理对象。我是debug发现clazz对象是个代理对象可知的,如下图。
上图可知,是cglib代理后的对象(默认是jdk的,我在application.yml里手动指定的cglib),那么我们获取代理对象的注解信息肯定是获取不到的,需要获取原始对象才能拿到注解等信息。
三、解决方案
通过org.springframework.core.annotation.AnnotationUtils
注解提供的findAnnotation
方法即可完美解决问题,代码在上面已经给到了。用clazz.getAnnotation(CategoryLog.class);
这种方式是获取不到的,获取的是代理对象的,为null。
四、广告
QQ群:458430385
微信公众号