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 调用,包括命令对象?

4

0 回答 0