2013-01-21 49 views
0

在這一刻我面臨着一個問題,真的不知道我做錯了什麼。我使用Spring框架和@AspectJ風格的AOP爲我的webservice編寫日誌記錄。我有兩個捆綁包 - 背景和前端。在後臺捆綁我有LogAspect,它看起來像這樣:SpringAOP,加載時間韋弗,奇怪的行爲

@Aspect 
public class LogAspect { 
    @Pointcut("@annotation(logMethod)") 
    public void logMethodAnnotated(LogMethod logMethod){} 

    @Before("logMethodAnnotated(logMethod)") 
    public void beforeLogMethodAnnotated(JoinPoint jp){ 
     //actions 
    } 

    @After("logMethodAnnotated(logMethod)") 
    public void afterLogMethodAnnotated(JoinPoint jp){ 
     //actions 
    } 
} 

和META-INF /春/背景osgi.xml:

<context:annotation-config /> 
<context:component-scan base-package="simon.background"/> 

<context:load-time-weaver /> 

也META-INF/aop.xml文件:

<!DOCTYPE aspectj PUBLIC 
     "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd"> 
<aspectj> 

    <weaver> 

     <!-- only weave classes in our application-specific packages --> 
     <include within="simon.background.*"/> 
     <include within="simon.frontend.controller.*"/> 

    </weaver> 

    <aspects> 

     <!-- weave in just this aspect -->   
     <aspect name="simon.background.log.LogAspect"/> 

    </aspects> 

    </aspectj> 

在前端包中,我剛剛放入aplicationContext.xml <context:load-time-weaver aspectj-weaving="on" />。但是代碼的表現很奇怪。我發現,當我把我的建議方法JoinPoint作爲參數時,會出現一些問題。 (我的意思是,當我得到的建議方法沒有參數,所以方法頭沒有JoinPoin,一切都工作正常,建議已經運行在@LogMethod之前和之後(我的註釋,我用它說,我想記錄此方法)註釋的方法)。但現在它是這樣工作的: - 當我啓動服務器並且首次部署捆綁包時,則這些建議僅針對方法運行,它們是@LogMethod註釋的並且屬於後臺捆綁包,但不用於註釋frontend.controller中的方法。 - 此外,當我在我的一個控制器中做了一些更改,保存並僅部署了前端包時,則運行@LogMethod批註方法時,出現此錯誤:

org.springframework.web。 util.NestedServletException:處理程序處理失敗;嵌套異常是java.lang.LinkageError:加載器約束違規:解析方法「simon.background.log.LogAspect.afterLogMethodAnnotated(Lorg/aspectj/lang/JoinPoint;)V」類加載器(com/springsource/kernel /當前類,simon/frontend/controller/HuhController和類加載器(com/springsource/kernel/userregion/internal/equinox/KernelBundleClassLoader的實例)中的解析類,simon/background/log/LogAspect,爲類型/ aspectj/lang/JoinPoint使用不同的Class對象;)V用於簽名

任何想法正在發生什麼以及如何修復它,所以我的程序將能夠運行通知是否正確?

還有一點需要注意,它可能會有所幫助:當我在調試模式下運行這個提示,但沒有JoinPoint參數時,我意識到,這兩個建議都是針對一種方法運行兩次。

回答