Аспект методов в расширенном классе не работает - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь применить аспект для двух методов, которые находятся в абстрактном классе, который расширен другим классом.

Проблема в том, что используемый мной pointcut не работает.

Код выглядит следующим образом:

public class ClassA extends ClassB {

    public void testMethod(String testString, Integer testInt){
        extendedClassMethod1(testString, testInt);
        extendedClassMethod2(testString, testInt);
    }
}

public abstract class ClassB {

   public String extendedClassMethod1(String testString, Integer testInteger) {
        return testString + testString.toString();
    }

    public String extendedClassMethod2(String testString, Integer testInteger) {
        return testString + testString.toString();
    }
}

@Aspect
public class AspectClass {

   @AfterReturning(
            value = "execution(* com.test.ClassB.*(..)) && args(testString, testInteger)",
            returning = "result")
    public void aspectMethod(JoinPoint joinPoint, String testString, Integer testInteger, String result){
        // do something
    }
}

Цель состоит в том, чтобы создать аспект, который будет работать, когда extendedClassMethod1 или extendedClassMethod2 используется в классах (например, ClassA), расширяющих ClassB.

Другое дело, что Intellij показывает, что метод аспекта должен применяться к этим двум методам, но во время выполнения это не так.

1 Ответ

1 голос
/ 30 января 2020

Я прокомментировал:

Если вы действительно используете AspectJ (например, через конфигурацию ткачества во время загрузки), а не Spring AOP, он работает как вы sh. Если это не работает, вы не используете AspectJ. Это так просто. Если вы хотите оспорить мое утверждение, просто предоставьте MCVE вкл. Maven POM и в идеале на GitHub, так что я могу просто клонировать и запустить приложение, например, через Spring Boot. Кстати, чтобы сделать это с POJO, вам совсем не нужен Spring. Я проверил ваш код вне Spring.

Чтобы поддержать мое утверждение, вот мой MCVE, использующий POJOs + AspectJ:

Базовый класс (почему-то абстрактный, потому что там не являются абстрактными методами):

package de.scrum_master.app;

public abstract class ClassB {
  public String extendedClassMethod1(String testString, Integer testInteger) {
    return testString + " / " + testInteger.toString();
  }

  public String extendedClassMethod2(String testString, Integer testInteger) {
    return testString + " / " + testInteger.toString();
  }
}

(Бетон) подкласс:

package de.scrum_master.app;

public class ClassA extends ClassB {
  public void testMethod(String testString, Integer testInt) {
    extendedClassMethod1(testString, testInt);
    extendedClassMethod2(testString, testInt);
  }
}

Приложение драйвера:

package de.scrum_master.app;

public class Application {
  public static void main(String[] args) {
    ClassA classA = new ClassA();
    classA.extendedClassMethod1("eleven", 11);
    classA.extendedClassMethod2("twenty-two", 22);
    classA.testMethod("thirty-three", 33);
  }
}

Формат:

package de.scrum_master.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class AspectClass {
  @AfterReturning(
    value = "execution(* de.scrum_master.app.ClassB.*(..)) && args(testString, testInteger)",
    returning = "result"
  )
  public void aspectMethod(JoinPoint joinPoint, String testString, Integer testInteger, String result) {
    System.out.println(joinPoint);
    System.out.println("  testString = " + testString);
    System.out.println("  testInteger = " + testInteger);
    System.out.println("  result = " + result);
  }
}

Журнал консоли:

execution(String de.scrum_master.app.ClassB.extendedClassMethod1(String, Integer))
  testString = eleven
  testInteger = 11
  result = eleven / 11
execution(String de.scrum_master.app.ClassB.extendedClassMethod2(String, Integer))
  testString = twenty-two
  testInteger = 22
  result = twenty-two / 22
execution(String de.scrum_master.app.ClassB.extendedClassMethod1(String, Integer))
  testString = thirty-three
  testInteger = 33
  result = thirty-three / 33
execution(String de.scrum_master.app.ClassB.extendedClassMethod2(String, Integer))
  testString = thirty-three
  testInteger = 33
  result = thirty-three / 33
...