[英]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.