我当前在一种方法上使用以下切入点,该方法将对应用程序中每个服务方法的调用记录到日志:
@Before("execution(* com.mdenis.someAppName..service..*(..))")
有问题的方法使用Apache记录器,并且运行完美。现在,我也希望这些日志记录语句也可以通过LogEntryService类写入数据库。问题在于,这实际上是在造成StackOverflow错误,因为记录服务包中所有内容的方法正在调用同一包内的方法。
是否可以更改切入点以排除某个类?
答案 0 :(得分:0)
怎么样?
@Before(
"execution(* com.mdenis.someAppName..service..*(..)) && " +
"!within(*..LogEntryService)"
)
答案 1 :(得分:0)
我最终将类切入点与注释切入点组合在一起,例如:
@Pointcut("execution(* com.service.processes.communication.CommunicationProcess.*(..))")
private void communicationMethods() {}
@Pointcut("execution(@com.lib.annotation.Loggable * *.*(..))")
private void loggableMethods() {}
@Before("communicationMethods() && loggableMethods()")
public void logMethodCallWithParameters(JoinPoint joinPoint)
{
if (joinPoint.getArgs().length == 0)
{
logEntryService.logDebug(LogEntrySource.SERVICE, LogEntryType.MESSAGING, "Method " + joinPoint.getTarget().getClass().getCanonicalName()
+ "." + joinPoint.getSignature().getName() + " called with no argument", logger);
}
else
{
logEntryService.logDebug(LogEntrySource.SERVICE, LogEntryType.MESSAGING, "Method " + joinPoint.getTarget().getClass().getCanonicalName()
+ "." + joinPoint.getSignature().getName() + " called with argument(s) " + getArgumentString(joinPoint.getArgs()), logger);
}
}