2013-12-19 25 views
0

我陷入了一個非常奇怪的問題。我上課Java/cglib忽略方法何時只能調用超級?

public class A extends ...{ 

} 

public class B extends A{ 

    @Override 
    @PreAuthorize(...) 
    public String doMagic(){ 
     String v = super.doMagic(); 
     doSomeOtherThings(); 
     ... 
     return v; 
    } 
} 

有延伸的多個類,所以我重構成:

public class A extends ...{ 

    @Override 
    public String doMagic(){ 
     String v = super.doMagic(); 
     doSomeOtherThings(); 
     ... 
     return v; 
    } 
} 

public class B extends A{ 

    @Override 
    @PreAuthorize(...) 
    public String doMagic(){ 
     return super.doMagic(); 
    } 
} 

但現在有趣的事情發生了......

我有測試驗證的訪問權限(基於PreAuthorize),它在IntelliJ中正確執行,但在使用maven執行時失敗。它看起來像來自B的方法被忽略和/或註釋沒有被處理。 在第一個版本中,測試通過了這兩種情況。

任何想法可能發生了什麼?這似乎是這個問題可能要CGLIB有關..

,並在這樣的情況下,再次工作:

public class A extends ...{ 

    protecte String doMagic2(){ 
     String v = super.doMagic(); 
     doSomeOtherThings(); 
     ... 
     return v; 
    } 
} 

public class B extends A{ 

    @Override 
    @PreAuthorize(...) 
    public String doMagic(){ 
     return doMagic2(); 
    } 
} 
+0

你是否在maven和你的ide起訴相同的jdk? –

+0

您應該發佈有關A延伸的類的更多詳細信息。它可能有幫助。 – djangofan

+0

擴展業務服務,與訪問控制無關 – zibi

回答

3

與您提供的信息,這是最有可能發生的情況:爲了創建一個代理,cglib在運行時創建一個子類,覆蓋所有應該攔截的方法。然而,這個概念不允許攔截明確命中超類的調用,因爲繞過了代理方法的運行時實現。我在這裏詳細說明了這一點:Why does cglib not proxy super invocations?

此外,當一個方法被cglib覆蓋時,重寫的方法的註釋不再存在。我假設你在某種程度上接近@PreAuthorize -annotated方法,以便在應用cglib爲您創建的運行時子類之後註釋不再可見。

如果Maven和IntelliJ的結果不同,那麼您的設置中最有可能出現錯誤,因爲它們都不應編碼。