Как я могу изменить порядок выполнения двух или более советов, аннотированных одной и той же аннотацией, такой как @Around в AspectJ? - PullRequest
0 голосов
/ 31 августа 2018

Вот мой код:

@Pointcut("execution(* *(..))")
public void cutPointToken() {}

@Pointcut("execution(* *(..))")
public void cutPointEmptyParam() {}

@Around("cutPointToken()")
public Object authenticateToken(ProceedingJoinPoint joinPoint) throws Throwable {
    LOGGER.info("authenticate -- start --");
    ...
    Object o = joinPoint.proceed();
    LOGGER.info("authenticate -- end --");
    return o;
}

@Around("cutPointEmptyParam()")
public Object checkParameter(ProceedingJoinPoint joinPoint) throws Throwable {
    LOGGER.info("check param -- start --");
    ...
    Object o = joinPoint.proceed();
    LOGGER.info("check param -- end --");
    return o;
}

Я получил:

authenticate -- start --
check param -- start --
...
check param -- end --
authenticate -- end --

Ожидаемое:

check param -- start --
authenticate -- start --
...
authenticate -- end --
check param -- end --

Как я могу изменить порядок выполнения этих двух методов?

Попытка аннотации @Order, @Order(1) для метода checkParameter и @Order(2) для другого, но это не работает.

1 Ответ

0 голосов
/ 31 августа 2018

Идея использования аннотации @Order верна, однако поместите ее на уровне класса в качестве документации 7.2.4.7 Упорядочение рекомендаций состояний.

Это делается обычным способом Spring путем реализации org.springframework.core. Упорядоченный интерфейс в классе аспектов или аннотирование его аннотацией Order.

Размещение методов, помеченных @Aspect, не будет работать, так как оно не зарегистрировано как компонент. Найдите аннотацию @Order в 1.9.2. @ Autowired секция.

Аннотация @Order может быть объявлена ​​на уровне целевого класса, но также и на @Bean методах ...

@Aspect
@Order(1)
public class CheckParameterAspect {

    @Around("cutPointEmptyParam()")
    public Object checkParameter(ProceedingJoinPoint joinPoint) throws Throwable {
        //...
    }
}

@Aspect
@Order(2)
public class AuthenticateTokenAspect {

    @Around("cutPointToken()")
    public Object authenticateToken(ProceedingJoinPoint joinPoint) throws Throwable {
        //...
    }
}

Редактировать: Заказ от 0 представляется возможным.

...