带有@annotation(...)的Spring AOP在某些情况下似乎不起作用

问题描述 投票:0回答:1

我希望新手能够帮助我,因为我是Spring AOP的新手。我实现了一个方面,该方面在我的一种方法上工作得很好。但是,当我重构方法并提取一些逻辑(包括我用来触发方面的注释)时,就不再调用该方面。下面提供了更多详细信息。

我有类似的东西:

@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”的方法,都应执行该方面,但这似乎并非如此。还是我错过了什么?

谢谢您的帮助!

java annotations spring-aop
1个回答
0
投票

无法使用Spring AOP截获内部呼叫。

来自documentation的相关信息

由于Spring AOP框架基于代理的性质,根据定义,目标对象不会被拦截。对于JDK代理,只能对代理进行公共接口方法调用被拦截。使用CGLIB,可在代理被拦截(甚至包可见的方法,如果必要)。但是,通过代理进行的常见互动应始终通过公共签名设计。

© www.soinside.com 2019 - 2024. All rights reserved.