最初的想法:当控制器抛出异常时,只有堆栈跟踪可用,但不是导致它的参数。想法是将日志记录方面包含在线程的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的调用?