Аннотация и Pointcut для одного метода класса - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть два аспекта, но работает только TryCatchLog, даже если метод аннотирован с помощью CatchRedBanner.

  1. Один для всех методов, возвращающих AssertionData на странице пакета. Действия
package com.abc.acceptance.b2b.aspects;

@Aspect
@Component
public class TryCatchLogAspect {

    @Pointcut(
            "execution(com.abc.acceptance.b2b.annotations.AssertionData com.abc.acceptance.b2b.pageActions..*(..))")
    private void pageActionsTryCatchLog() {
    }

    @Around("pageActionsTryCatchLog()")
    public Object tryCatchLog(ProceedingJoinPoint joinPoint) throws Throwable { ... 
Это для методов с моей аннотацией

import java.lang.annotation.*;

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckRedBanner {
}

-----

package com.abc.acceptance.b2b.annotations;

@Aspect
@Component
@Slf4j
public class CheckRedBannerAspect {

    @Before("@annotation(CheckRedBanner)")
    public void myAdviceForMethodAnnotation(JoinPoint joinPoint) {
        handleBeforeExecution(joinPoint);
    }

    protected void handleBeforeExecution(JoinPoint joinPoint) {
        System.out.println("Made iitttt !!! ");
    }
}

Мой код вызывает только TryCatchLog, но не CheckRedBanner, даже когда я аннотирую метод

package com.abc.acceptance.b2b.pageActions;

@Component
@Slf4j
@Scope(SCOPE_CUCUMBER_GLUE)
public class BroadbandPanelActions extends PageActions {

    @CheckRedBanner
    public AssertionData clickFindAddress() {
        broadbandPanel.getFindAddressButton().click();
        return new AssertionData();
    }
...

1 Ответ

0 голосов
/ 06 февраля 2020

Из справочных документов, касающихся Заказ заказа

Когда два совета, определенных в разных аспектах, должны работать в одной точке соединения, если не указано иное, порядок исполнения не определен. Вы можете контролировать порядок выполнения, указав приоритет.

Для меня поведение воспроизводимо, когда я заказываю Аспекты следующим образом. Я приказал, чтобы Around совет выполнялся до Before совета. Также обратите внимание, что я прокомментировал вызов joinPoint.proceed();.

@Component
@Aspect
@Order(0)
public class TryCatchLogAspect {

    @Pointcut("execution(sec2.aop.bean.AssertionData sec2.aop.bean..*(..))")
    private void pageActionsTryCatchLog() {
    }

    @Around("pageActionsTryCatchLog()")
    public Object tryCatchLog(ProceedingJoinPoint joinPoint) throws Throwable {

         // Object result = joinPoint.proceed();

        System.out.println("pageActionsTryCatchLog");
        return new AssertionData();
    }

}

и

@Component
@Aspect
@Order(1)
public class CheckRedBannerAspect {
    @Before("@annotation(CheckRedBanner)")

    public void myAdviceForMethodAnnotation(JoinPoint joinPoint) {
        handleBeforeExecution(joinPoint);
    }

    protected void handleBeforeExecution(JoinPoint joinPoint) {
        System.out.println("Made iitttt !!! ");
    }
}

, когда я раскомментировал вызов proceed(), оба аспекта работают.

@Around("pageActionsTryCatchLog()")
public Object tryCatchLog(ProceedingJoinPoint joinPoint) throws Throwable {

    Object result = joinPoint.proceed();

    System.out.println("pageActionsTryCatchLog");
    return new AssertionData();
}

Когда мы явно не называем joinPoint.proceed();, весна делает это за нас. Но в первом случае мы возвращаемся без вызова базового метода, и @Before рекомендация не выполняется.

...