Spring AOP с @annotation (...) в некоторых случаях не работает - PullRequest
0 голосов
/ 15 апреля 2020

Я новичок в Spring AOP. Я реализовал аспект, который отлично работает на одном из моих методов. Но когда я реорганизую метод и извлекаю часть логики c (включая аннотацию, которую я использую для запуска аспекта), аспект больше не вызывается. Более подробная информация представлена ​​ниже.

У меня есть что-то похожее на это:

@RequiresCheck
public ServiceResult<AccountDto> save(AccountDto accountDto) {
    // some logic here
    accountRepository.save(account.toAccount());
    // some logic there
    return ServiceResult.ok(accountDto);
}

И аспект, похожий на этот

@Around("@annotation(requiresCheck)")
public Object checkFullSemRights(ProceedingJoinPoint joinPoint) throws Throwable {
    if (check()) {
        return joinPoint.proceed();
    }
    throw new Exception();
}

Этот код работает просто отлично ! Когда я реорганизую первый метод, который будет выглядеть следующим образом:

public ServiceResult<AccountDto> save(AccountDto accountDto) {
    // some logic here
    return save2(accountDto.toAccount());
}

@RequiresCheck
public ServiceResult<AccountDto> save2(Account account) {
    accountRepository.save(account);
    // some logic there
    return ServiceResult.ok(account.toAccountDto());
}

Тогда аспект больше не выполняется. Я подумал, что этот аспект должен выполняться для любого метода, который имеет аннотацию "@ResuiresCheck", но, похоже, это не так. Или я что-то упустил?

1 Ответ

1 голос
/ 15 апреля 2020

Внутренние вызовы не могут быть перехвачены с помощью Spring AOP.

Соответствующая информация из документации

Из-за прокси-природы Spring AOP Framework, вызовы внутри целевого объекта по определению не перехватываются. Для JDK-прокси могут быть перехвачены только вызовы метода интерфейса publi c на прокси. С CGLIB publi c и вызовы защищенного метода на прокси перехватываются (и даже методы, видимые для пакета, если необходимо). Тем не менее, общие взаимодействия через прокси-серверы всегда должны разрабатываться через публичные c подписи.

...