EnhancerBySpringCGLIB 获取getParameterAnnotations为null的解决办法

简介: EnhancerBySpringCGLIB 获取getParameterAnnotations为null的解决办法

一、问题背景

开发程序的时候使用了aop去代理对象,然后其他地方会获取到这个代理对象并获取上面的方法注解和参数注解,运行时却发现无法获取注解,最终折腾一番终于解决。

二、问题原因

Spring项目中若开启CGLIB代理 spring.aop.proxy-target-class=true

注入接口后无法获取其实现类上注解。

通过debug得到class文件名含有EnhancerBySpringCGLIB:使用了AOP去进行代理,由于代理的对象不是接口,代理对象是由cglib代理的。

三、解决方案

正常情况获取注解方式:

Annotation[][] parameterAnnotations = method.getParameterAnnotations();

因此决定换个思路,直接获取cglib代理类的原始对象,获取原始对象上的参数注解就可以了

那我们的解决方式是加一个判断,如果是CGLIB代理类,则通过它的父类去获取方法的参数注解。

    Annotation[][] parameterAnnotations = method.getParameterAnnotations();
            if(method.getDeclaringClass().getName().contains("$$")) {
                try {
                    parameterAnnotations = method.getDeclaringClass().getSuperclass().getDeclaredMethod(method.getName(), method.getParameterTypes()).getParameterAnnotations();
                } catch (NoSuchMethodException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (SecurityException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

注:刚开始网上有解决方案是:

1.将spring.aop.proxy-target-class=true 去掉, 自动使用JDK代理。

2.使用注解解析器工具

import org.springframework.core.annotation.AnnotationUtils;
public static <A extends Annotation> A findAnnotation(Class<?> clazz, Class<A> annotationType) {
    return findAnnotation(clazz, annotationType, true);
}

这种方式,小伙伴们也可以去尝试一下,但是我用的springboot框架,我的项目内还是需要用到spring的aop动态代理的。

相关文章
|
存储 网络协议 Java
SpringBoot在自定义实现类中调用service层等Spring其他层报错为null的解决办法
SpringBoot在自定义实现类中调用service层等Spring其他层报错为null的解决办法
610 0
|
Python
解决办法:一切都正确,Python3执行PyImport_Import()一直返回NULL
解决办法:一切都正确,Python3执行PyImport_Import()一直返回NULL
180 0
JSONObject自动隐藏为null的属性的解决办法
JSONObject自动隐藏为null的属性的解决办法
246 0
解决办法一:GetProcAddress函数返回值总为NULL
解决办法一:GetProcAddress函数返回值总为NULL
238 0
错误解决办法:‘NULL’ was not declared in this scope
错误解决办法:‘NULL’ was not declared in this scope
265 0
env->FindClass()为NULL的一种解决办法
env->FindClass()为NULL的一种解决办法
161 0
|
Java Spring
websocket @Autowired注入为null问题的解决办法
websocket @Autowired注入为null问题的解决办法
env-&gt;FindClass()为NULL的一种解决办法
env-&gt;FindClass()为NULL的一种解决办法
183 0
|
Java 数据库连接 数据库
【MyBatis】关于MyBatis插入自动增长id的Bean到数据库后返回的id为null的解决办法
转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自【大学之旅_谙忆的博客】 解决办法其实很简单,只需要为你的**.xml中的insert增加两个属性就可以了。
2134 0
|
Linux 数据安全/隐私保护 Shell