繁体   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