在我的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 *************");
}
}
我可以看到事务很好地查看日志,但是这个新声明的建议不会被执行。
有什么事吗?
答案 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,..)")