getAnnotation為null的坑


在寫一個基於SpringAOP的權限控制的。

自己定義了一個注解,然后邏輯代碼需要通過獲取自定義注解的一個屬性來進行權限控制。

 

下面簡單上一下關鍵代碼:

自定義注解:

@Documented  //有關java doc的注解
@Retention(RetentionPolicy.RUNTIME)  //保留時間,這種類型的Annotations將被JVM保留,所以他們能在運行時被JVM或其他使用反射機制的代碼所讀取和使用.
@Target(ElementType.METHOD) //針對方法
public @interface AuthorizationNeed {
    
    //自定義注解的屬性,default是設置默認值
    //String operation() default "addAndUpdate";    
    String operation();    //這個屬性用來知道這是什么操作,不同操作的寫法不一樣

}

 

切點:

/**
     * 定義個個切入點
     * 所有有這個注解的方法
     */
    @Pointcut("@annotation(com.inforPoint.util.AuthorizationNeed)")
    private void needAuthorizationPoint() {}

 

然后在切面中有個@Around的環繞加強,需要在里面獲取注解AuthorizationNeed的屬性operation的值。  在網上找了個方法,這是一開始的寫法:

//下面這句代碼是獲得那個自定義的注解的對象
AuthorizationNeed authorizationNeed = ( (MethodSignature)proceedingJoinPoint.getSignature() ).getMethod().getAnnotation(AuthorizationNeed.class);

        
String operation = authorizationNeed.operation();  //用注解的時候有指明是什么操作

 

但卻在運行的時候一直反應  這個authorizationNeed是null。

 

網上有說可能是注解的定義問題,要

@Retention(RetentionPolicy.RUNTIME)

但顯然不是這個錯。

 

后面百度了很久之后,原來是這個aop攔截的是ServiceImpl的一個方法,然后這個ServiceImpl又啟動了事務管理,而事務管理又是基於AOP的。

也就是說,這個權限的@Around的切面攔截的是個代理對象的方法,而代理對象的方法是不會把原來父類中的方法的注解加上去的,所以這里這個注解的對象為null。后面網上找到了一個可以解決問題的代碼:

/**
     * 這個方法幫忙拿出注解中的operation屬性
     * 因為有攔截serviceImpl的方法,而這些方法又加了事務管理,也就是這里也有aop,這些已經是代理類,用之前的寫法獲得的是代理類的方法,而這些
     * 方法是特么不會把父類中的方法的注解加上去的!!!
     * @param proceedingJoinPoint
     */
    private String getOperationOfTheAnnotation(ProceedingJoinPoint proceedingJoinPoint) throws Exception {
        
        Signature signature =  proceedingJoinPoint.getSignature();//方法簽名
        Method method = ( (MethodSignature)signature ).getMethod();
        
        //這個方法才是目標對象上有注解的方法
        Method realMethod = proceedingJoinPoint.getTarget().getClass().getDeclaredMethod(signature.getName(), method.getParameterTypes());
        
                
        AuthorizationNeed authorizationNeed = realMethod.getAnnotation(AuthorizationNeed.class);
        
        return authorizationNeed.operation();
                

    }

 

參考博客:

https://www.cnblogs.com/qiumingcheng/p/5923928.html    貼近作者實際地講這個問題

https://blog.csdn.net/frightingforambition/article/details/78842306

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM