在這一刻我面臨着一個問題,真的不知道我做錯了什麼。我使用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參數時,我意識到,這兩個建議都是針對一種方法運行兩次。