AspectJ - Pointcut для всех классов в пакете, кроме одного - PullRequest
0 голосов
/ 31 января 2019

В настоящее время я использую следующий pointcut для метода, который регистрирует вызовы для каждого метода службы в моем приложении:

@Before("execution(* com.mdenis.someAppName..service..*(..))")

Данный метод использует регистратор Apache и отлично работает.Теперь я хочу, чтобы эти операторы протоколирования также записывались в базу данных (через класс LogEntryService).Проблема заключается в том, что это по сути создает ошибку StackOverflow, поскольку метод, который регистрирует все в пакете служб, вызывает метод внутри этого же пакета.

Есть ли способ изменить мой pointcut, чтобы исключить определенный класс?

Ответы [ 2 ]

0 голосов
/ 15 мая 2019

В итоге я скомбинировал pointcut класса с pointcut аннотации, например:

@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);
    }
}
0 голосов
/ 03 февраля 2019

Как насчет этого?

@Before(
  "execution(* com.mdenis.someAppName..service..*(..)) && " + 
  "!within(*..LogEntryService)"
)
...