在控制器上应用'around'方面后,它失败并显示错误,该错误指出'不存在此类方法或属性'

时间:2012-06-18 08:59:06

标签: grails aop grails-plugin spring-aop grails-2.0

最初的想法:当控制器抛出异常时,只有堆栈跟踪可用,但不是导致它的参数。想法是将日志记录方面包含在线程的grails控制器,服务和一些其他兴趣点(POI),并且在异常的情况下,它不仅记录堆栈跟踪而且记录来自所有POI的参数。注意:使用操作方法(因为grails 2.0)不是闭包。

做了什么:围绕应用了特定注释的所有调用的方面,并将调用参数收集到ThreadLocal变量中。在呼叫结束时,它检查它是否是错误,它是,然后它记录特定记录器中的所有调用链。它与服务工作正常,我在服务调用其他服务时尝试了组合,并且它工作得很完美。

问题:在控制器上应用此类方面时,它会失败。错误表明找不到任何方法(返回404错误),而它确实存在(在没有这种方面的情况下在控制器上运行相同的请求)。

具有如下所示的方面(简化版):

@Pointcut("@within(ThreadLoggerMarker)")
public void threadLoggerMarker(){}

@Around("threadLoggerMarker()")
public Object aroundMarker( ProceedingJoinPoint pjs )
throws Throwable
{
    String beanName = pjs.signature.declaringTypeName;
    String methodName = pjs.signature.name;
    Object[] methodParams = pjs.args;
    try{
        System.out.println( "Calling ${beanName}.${methodName}(${methodParams})" );
        return pjs.proceed();
    }catch( Exception ex ){
        System.out.println( "Got exception ${ex}" );
        throw ex;
    }
}

和控制器一样: @ThreadLoggerMarker class MainController {

MainService mainService

def dummyAction( Boolean fail ){
    try{
        render( text:mainService.dummyAction( fail ) )
    }finally{
        println( ThreadLoggerHelper.prettyPrintCurrentThreadCallTrace() );
    }
}

}

调用控制器结果(跳过包名称):

Calling MainController.getMetaClass([])
Calling MainController.getProperty([dummyAction])
Got exception groovy.lang.MissingPropertyException: No such property: dummyAction for class: MainController
Calling MainController.getProperty([params])
Calling MainController.getProperty([errors])
Calling MainController.getMetaClass([])

如果存在包含命令对象的所有参数,如何拦截对dummyAction的调用?

0 个答案:

没有答案