Как работает это сокращение в Spring AOP? - PullRequest
0 голосов
/ 01 ноября 2019

Я изучаю Spring AOP и получил следующее выражение pointcut из одного из примеров в разделе AOP spring-framework-reference : Продолжение с аргументами

@Around("execution(List<Account> find*(..)) && " +
        "com.xyz.myapp.SystemArchitecture.inDataAccessLayer() && " +
        "args(accountHolderNamePattern)")
public Object preProcessQueryPattern(ProceedingJoinPoint pjp,
        String accountHolderNamePattern) throws Throwable {
    String newPattern = preProcess(accountHolderNamePattern);
    return pjp.proceed(new Object[] {newPattern});
}

Насколько я понимаю, это выражение pointcut является неправильным, поскольку условия и никогда не будут удовлетворены. Я упускаю что-то очень очевидное?

Также я попытался сделать следующее ( ref ):

@Component
public class TestBean {
    public void testMethod() {
    }
}

Класс Aspect

@Before("com.test.bean.TestBean.testMethod()")
    public void testAspect() {
        System.out.println("Worked");
    }

, который не удалсяс

Caused by: java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut testMethod
    at org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:319)

1 Ответ

1 голос
/ 03 ноября 2019

Есть синтаксические ошибки в обоих pointcut. Вы не можете просто написать сигнатуру метода без execution(), если хотите перехватить метод. Также, пожалуйста, не забудьте указать тип возвращаемого значения или, по крайней мере, * для любого возвращаемого типа.

Первый синтаксис будет синтаксически правильным, например:

@Around(
  "execution(List<Account> find*(..)) && " +
  "execution(* com.xyz.myapp.SystemArchitecture.inDataAccessLayer()) && " +
  "args(accountHolderNamePattern)"
)

Но Он все равно не будет соответствовать ни одному методу, поскольку && (логическое И) требует, чтобы оба метода выполнялись одновременно, что невозможно. Выполняется либо find*(..), либо inDataAccessLayer(), но не оба одновременно. Вместо этого вы можете работать с || (логическое ИЛИ), но тогда сопоставление args() будет неоднозначным, и, таким образом, точка снова будет недействительной. Я не могу сказать вам, как исправить вашу точку отсчета, если вы не объясните мне, чего вы хотите достичь. Теперь это не имеет никакого смысла.

Что касается второго pointcut, вы можете исправить это так:

@Before("execution(* com.test.bean.TestBean.testMethod())")

Сообщение об ошибке, которое вы процитировали, означает, что парсер AspectJдумает, что вы ссылаетесь на именованный pointcut вместо выполнения предполагаемого метода.

...