最初的想法:当控制器抛出异常时,只有堆栈跟踪可用,而不是导致它的参数。想法是为线程放置一个包含 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 调用,包括命令对象?