Плагин AspectJ работает нормально, но во время выполнения аннотации не работают - PullRequest
0 голосов
/ 20 декабря 2018

Я использую плагин AspectJ Maven для создания своего проекта и использую AspectLibrary, которая является jar, в которой я определил свои аспекты.

Вот аспект, который я пытаюсь использовать

@Around("execution(* *(..))&&@annotation(com.cisco.commerce.pricing.lp.commons.util.annotations.TimeMe)")
public Object timeMeAroundAspect(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {// NOSONAR
    Timer timer = Timer.instance().start();
    MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();
    Method method = signature.getMethod();
    TimeMe timeMeAnnotation = method.getAnnotation(TimeMe.class);
    String name = timeMeAnnotation.name();
    boolean log = timeMeAnnotation.log();
    boolean addToMetrics = timeMeAnnotation.addToMetrics();
    Object response = null;
    try {
        response = proceedingJoinPoint.proceed();
    } finally {
        try {
            Long timeTaken = timer.timeTaken();
            if (log) {
                LOGGER.info("MethodName: {} Time taken: {}", name, timeTaken);
            }
            if (addToMetrics) {
                ExecutionDetailsUtil.addMethodExecutionTime(name, timeTaken);
            }
        } catch (Exception e) {
            LOGGER.warn("Exception while trying to log time", e);
        }
    }
    return response;
}

Этот код находится в jar-файле, который я использую в качестве аспекта-библиотеки в моем pom

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.7</version>
            <configuration>
                <showWeaveInfo>true</showWeaveInfo>
                <verbose>true</verbose>
                <encoding>UTF-8</encoding>
                <source>${java.source-target.version}</source>
                <target>${java.source-target.version}</target>
                <Xlint>ignore</Xlint>
                <aspectLibraries>
                    <aspectLibrary>
                        <groupId>it.cvc.ciscocommerce.lps.lp-commons</groupId>
                        <artifactId>lp-commons</artifactId>
                    </aspectLibrary>
                </aspectLibraries>
                <complianceLevel>${java.source-target.version}</complianceLevel>
            </configuration>
            <executions>
                <execution>
                    <phase>process-sources</phase>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
            </executions>
            <dependencies>
                <dependency>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjtools</artifactId>
                    <version>${aspectj.version}</version>
                </dependency>
            </dependencies>
        </plugin>

Ниже приведено определение моей аннотации

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TimeMe {

  public String name();

  public boolean log() default true;

  public boolean addToMetrics() default true;

}

Вотфрагмент, где я пытаюсь использовать эту аннотацию (в другой кодовой базе, которая использует вышеупомянутый jar в качестве зависимости)

@TimeMe(name = "classifyLine")
private void classifyLine(PricingObject pricingObject, 
   PricingLineObject pricingLineObject, LineTypes lineTypes) {
//logic
}

Моя сборка работает нормально и печатает следующее в консоли MAVEN

[INFO] точка соединения 'выполнение метода (void com.cisco.pricing.lps.main.ListPriceService.classifyLine (com.cisco.pricing.lps.bean.PricingObject, com.cisco.pricing.lps.bean.PricingLineObject, com.cisco.pricing.lps.dto.LineTypes)) 'in Type' com.cisco.pricing.lps.main.ListPriceService '(ListPriceService.java:235), советованный на основе рекомендаций от com.cisco.commerce.pricing.lp.commons.util.logging.LoggingAspectDefiner '(lp-commons-2019.03.01-SNAPSHOT.jar! LoggingAspectDefiner.class (из LoggingAspectDefiner.java))

Я взорвал файл войны и посмотрел на созданные файлы классов.У меня есть следующий класс AjcClosure1, сгенерированный для файла Java, в котором я использовал аннотацию.

public class ListPriceService$AjcClosure1 extends AroundClosure {

  public Object run(Object[] paramArrayOfObject) {
    Object[] arrayOfObject = this.state;
    ListPriceService.classifyLine_aroundBody0((ListPriceService) 
    arrayOfObject[0],
    (PricingObject)arrayOfObject[1],
    (PricingLineObject)arrayOfObject[2], (LineTypes)arrayOfObject[3], 
    (JoinPoint)arrayOfObject[4]);return null;
  }

  public ListPriceService$AjcClosure1(Object[] paramArrayOfObject)
  {
     super(paramArrayOfObject);
  }
}

А в файле класса Java, где я использую аннотацию, я не вижу изменений в методе classifyLine.

Однако, когда я запускаю свое приложение, аннотация не работает.Он не выполняет аспект, который я определил в банке.

Понятия не имею, почему.Мой шаблон не совпадает?Он подходит и отлично работает в приложении Spring, но не в этом приложении, отличном от Spring.

...