簡體   English   中英

Spring AOP:具有@Transactional注釋方法的方法的注釋切入點?

[英]Spring AOP : Annotated pointcuts for a method with @Transactional annotated method?

在我的業務邏輯方法中,我對事務管理使用了以下注釋。

@Service
public class SampleBusinessLogicImpl implements SampleBusinessLogic {


    @Override
    @Transactional(rollbackFor=Exception.class)
    public Sample createSample(Sample sample) throws SampleException {
             ...
        }
}

我想為此方法執行另一個方面,我定義了一個方面,如下所示:

@Aspect
public class SampleDynamicValidationAspect {

    private static final Logger logger = LoggerFactory.getLogger(RequestValidationAspect.class); 


    @Before("execution(public * com.rakuten.gep.sample.businesslogic.impl.SampleBusinessLogicImpl.createSample(com.rakuten.gep.sample.entity.common.Sample,..)) && args(sample,..) throws *Exception")
    public void validate(Sample sample) throws SampleException {
        //Dynamic validation here.
        //If some validation is failed, wrapped the appropiate exception in SampleException
        logger.debug("Involking Dynamic Validator");
        System.out.println("************** Dynaic Validator *************");
    }
}

我可以看到事務在查看日志時工作正常,但是此新聲明的通知未得到執行。

有事嗎

嘗試將validate(Sample)更改為validate(JointPoint)

您可以通過不同的方式來實現。 例如,您可以找到可以測試的不同切入點選項。 在下面,您可以找到不同的選項,可以嘗試使方面發揮作用。

通過執行與@Transactional匹配的所有內容

execution(@Transactional * *.*(..))

通過執行每個公共方法(您可以使用它來測試您的Aspect框架是否配置正確)。

execution(public * *(..))

通過添加這樣的切入點,然后將其應用於您的方面:

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

@Around("monitorRequestTargets()")
public void validate(Sample sample) throws SampleException {

讓我知道是否可以正常工作。

您的切入點表達式應為

@Before("execution(public * com.rakuten.gep.sample.businesslogic.impl.SampleBusinessLogicImpl.createSample(com.rakuten.gep.sample.entity.common.Sample,..) throws *Exception) && args(sample,..)")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM