AspectJ Выражение для существующей аннотации, pointcut после аннотации, но до выполнения метода - PullRequest
0 голосов
/ 15 апреля 2020

Вот существующий код:

@Transactional
//  <-- Want to Pointcut to here, after Transactional is done, before method execution
public String getUsername(int userId) {
     ...
}

Попытка навести курсор на закомментированную строку, вот что я попробовал до сих пор:

@Around("@annotation(org.springframework.transaction.annotation.Transactional) " +
        " && !target(org.springframework.transaction.interceptor.TransactionAspectSupport)")
public Object runQueryWithinTransaction(ProceedingJoinPointjp) throws Throwable {
     ...
}

Также попытался установить порядок моего аспекта LowestPrecedence. Несмотря на все это, я все еще вижу, как мой Aspect вызывается перед методом invokeWithinTransaction в Transactional. Пробовал "@After", но он был выполнен после моего метода "getUsername". Попробовал "@Before" без причины, но это, очевидно, не помогло.

Что мне делать вместо этого?

1 Ответ

0 голосов
/ 16 апреля 2020

Решил это, установив приоритет в моем аспекте следующим образом:

@Aspect
@DeclarePrecedence("org.springframework.transaction.aspectj.AnnotationTransactionAspect, *")
public class MyAspect {
    ....
}

Благодаря @kriegaex, если вы не используете AspectJ и обычную Spring AOP, вы должны попытаться использовать @Ordered и @Order аннотации. @Order on Spring Транзакционная аннотация может быть установлена ​​в аннотации @EnableTransactionManagement и может устанавливать более низкий приоритет (или вообще никакого, так как самый низкий приоритет по умолчанию) для вашего собственного аспекта.

...