gpt4 book ai didi

java - Spring AOP AsjectJ注释: define pointcut for multiple methods

转载 作者:行者123 更新时间:2023-12-02 06:15:30 24 4
gpt4 key购买 nike

我已经通过建议定义了要执行的两种方法:

SampleBusinessLogicImpl.updateSample(示例示例)SampleBusinessLogicImpl.createSample(示例示例)

但我的建议仅针对第一个 update() 方法执行。我在这里做错了什么?

@Aspect
public class SampleDynamicValidationAspect {

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

/**
private SampleTblDAO dao; //DAOs can be used inside dynamic validations
**/


@Before("execution(public * com.rakuten.gep.sample.businesslogic.impl.SampleBusinessLogicImpl.updateSample(com.rakuten.gep.sample.entity.common.Sample,..)) && args(sample,..) throws *Exception"
+"|| 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
System.out.println("Involking Dynamic Validator");
}
}

我的 SampleBusinessLogicImpl 类如下:

@Service
public class SampleBusinessLogicImpl implements SampleBusinessLogic {

@Autowired
@Qualifier(value="proxySampleTblDao")
private SampleTblDao sampleTblDao;

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


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

}
}

最佳答案

当您在切入点中定义匹配方法表达式时,它应该与您想要建议的实际方法相匹配

这就是你的切入点表达式应该是的

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

Reason:

在您的情况下,方法签名是

public Sample createSample(Sample sample) throws SampleException {
public Sample updateSample(Sample sample) throws SampleException {

但是,你的切入点是

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

请注意,抛出 *Exception 位于切入点 表达式中的方法声明之外。这就是切入点表达式与您的方法声明不匹配的原因。将 throws *Exception 移至 execution( 内,它将起作用。我刚刚尝试过。

澄清仅调用一种方法。

是的,实际上..您不需要指定抛出*Exception。仅使用该方法就足够了,因此,如果您完全删除它,则两种方法执行都可以完美地工作。现在, update 起作用的原因是,它首先在 Pointcut 表达式中声明。因此,切入点与 updateSample() 的方法声明相匹配,然后遇到不适当的 *Exception 和 ||应用于*Exception,实际上什么也没有。

现在,如果您只是按照声明的方式翻转切入点表达式,那就是错误的。只有 createSample 可以工作,因为这是切入点表达式中唯一匹配的内容。请记住,)执行表达式 中也是封闭的。

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

此外,来自 Spring AOP 文档

执行(修饰符模式?ret-type-pattern 声明类型模式?name-pattern(param-pattern)
抛出模式?)

除返回类型模式(上面代码片段中的 ret-type-pattern)、名称模式之外的所有部分,参数pattern可选。

希望我能够帮助解决这个疑问。

关于java - Spring AOP AsjectJ注释: define pointcut for multiple methods,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21518697/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com