Spring AOP:使用@Transactional注释方法的方法的带注释的切入点?

时间:2014-01-29 08:31:06

标签: java spring aspectj spring-aop spring-annotations

在我的businesslogic方法中,我使用了以下注释进行事务管理。

@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 *************");
    }
}

我可以看到事务很好地查看日志,但是这个新声明的建议不会被执行。

有什么事吗?

3 个答案:

答案 0 :(得分:1)

尝试更改验证(Sample)以验证(JoinPoint)

答案 1 :(得分:1)

您可以通过不同方式实现这一目标。例如,您可以找到可以测试的不同切入点选项。您可以在下面找到可以尝试使您的方面有效的不同选项。

执行匹配@Transactional

的所有内容
execution(@Transactional * *.*(..))

通过执行每个公共方法(您可以使用它来测试是否已正确配置Aspect框架)。

execution(public * *(..))

通过添加这样的切入点然后将其应用到您的方面:

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

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

如果其中任何一项工作正常,请告诉我。

答案 2 :(得分:0)

你的切入点表达式应该是

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