私はSpring AOPの初心者です。
アプリケーションが例外をスローしている間、アプリケーションのすべてのメソッドに対してアスペクト アドバイスを作成しました (Grails で試しました)。
ExceptionService.groovy
@Aspect
public class ExceptionService {
def logMessage(def message){
def expInstance = new LogMessage(message:message)
expInstance.save(flush:true)
}
@Pointcut("execution(* com.mypackage..* (..))")
def allActions(){}
@AfterThrowing(pointcut="allActions()", throwing="e")
def allActionAdvice(JoinPoint joinPoint, Throwable e){
def className = joinPoint.getTarget().getClass().getSimpleName()
logMessage(className+"\n"+e.message)
}
@Pointcut("execution(* org.apache.commons.logging.Log.error(..))")
def logErrorActions(){}
@Before(value = "logErrorActions()")
def logErrorActionAdvice(JoinPoint joinPoint){
def className = joinPoint.getTarget().getClass().getSimpleName()
logMessage("Error in "+className)
}
}
resources.groovy
beans = {
xmlns aop:"http://www.springframework.org/schema/aop"
aspectBean(com.mypackage.services.ExceptionService)
aop.config("proxy-target-class":true) {
}
}
ここでは、アプリケーション内で発生するすべての例外に対して正常に機能してallActionAdvice()
います。しかし、それは機能していませんlog.error(logErrorActionAdvice())
。
Googleで調査したところ、問題はAOPとウィービングなどのサードパーティの依存関係にあることがわかりました。そのため、アスペクト ウィービング (コンパイル時ウィービング) を行う必要があります。しかし、良い例は見つかりませんでした。
アスペクトのコンパイル時ウィービングを使用するには、Grails アプリケーションについて何を変更する必要がありますか?それとも他に何かする必要がありますか?