6

我正在使用 AspectJ 来建议所有具有所选类参数的公共方法。我尝试了以下方法:

pointcut permissionCheckMethods(Session sess) : 
    (execution(public * *(.., Session)) && args(*, sess));

这对于具有至少 2 个参数的方法非常有效:

public void delete(Object item, Session currentSession);

但它不适用于以下方法:

public List listAll(Session currentSession);

如何更改我的切入点以建议两种方法执行?换句话说:我希望“..”通配符代表“零个或多个参数”,但看起来它的意思是“一个或多个”......

4

5 回答 5

8

哦,好吧...我用这个讨厌的技巧解决了这个问题。仍在等待某人以“官方”切入点定义出现。

pointcut permissionCheckMethods(EhealthSession eheSess) : 
    (execution(public * *(.., EhealthSession)) && args(*, eheSess))
    && !within(it.___.security.PermissionsCheck);

pointcut permissionCheckMethods2(EhealthSession eheSess) : 
    (execution(public * *(EhealthSession)) && args(eheSess))
    && !within(it.___.security.PermissionsCheck)
    && !within(it.___.app.impl.EhealthApplicationImpl);

before(EhealthSession eheSess) throws AuthorizationException : permissionCheckMethods(eheSess)
{
    Signature sig = thisJoinPointStaticPart.getSignature(); 
    check(eheSess, sig);
}

before(EhealthSession eheSess) throws AuthorizationException : permissionCheckMethods2(eheSess)
{
    Signature sig = thisJoinPointStaticPart.getSignature(); 
    check(eheSess, sig);
}
于 2008-11-26T11:37:26.930 回答
4

怎么样:

pointcut permissionCheckMethods(Session sess) : 
(execution(public * *(..)) && args(.., sess));

如果最后一个(或唯一一个)参数是 Session 类型,我想这将匹配。通过交换 args 的位置,您还可以首先匹配或仅匹配。但我不知道是否可以匹配任意位置。

于 2009-06-10T09:06:42.637 回答
3

我无法为您扩展 AspectJ 语法,但我可以提供一种解决方法。但首先让我解释一下为什么不能用切入点中的定义来做你想做的事args:因为如果你要EhealthSession在方法签名中的任何地方匹配你的参数,AspectJ 应该如何处理签名包含该类的多个参数的情况? 的含义eheSess将是模棱两可的。

现在解决方法:它可能会更慢 - 多少取决于您的环境,只需测试它 - 但您可以让切入点匹配所有潜在方法,而不管它们的参数列表如何,然后让建议通过检查参数找到您需要的参数列表:

pointcut permissionCheckMethods() : execution(public * *(..));

before() throws AuthorizationException : permissionCheckMethods() {
    for (Object arg : thisJoinPoint.getArgs()) {
        if (arg instanceof EhealthSession)
            check(arg, thisJoinPointStaticPart.getSignature());
    }
}

within(SomeBaseClass+)PS:也许您可以通过或within(*Postfix)或或或来缩小焦点,within(com.company.package..*)以免将建议应用于整个宇宙。

于 2012-08-09T11:43:42.120 回答
3

您必须在结尾和开头使用 .. (双点),如下所示:

pointcut permissionCheckMethods(Session sess) : 
    (execution(public * *(.., Session , ..)) );

还要摆脱,&& args(*, sess)因为这意味着您希望仅捕获具有任何类型的第一个参数但sess作为第二个参数且不超过 2 个参数的方法。

于 2017-05-01T17:04:53.537 回答
0
@Before(value = "execution(public * *(.., org.springframework.data.domain.Pageable , ..))")
private void isMethodPageable () {
    log.info("in a Aspect point cut isPageableParameterAvailable()");
}
于 2020-04-13T14:15:11.160 回答