具有方法参数的Spring AOP Aspect建议

时间:2019-03-21 18:08:36

标签: spring spring-mvc aop aspectj spring-aop

我有如下方面的建议

@AfterReturning("execution(* de.ojk.platform.servicelayer.session.SessionService.getAttribute(..))")
public void fixUrl()
....

getAttribute方法仅接受一个String参数。

我想做什么,我只想在给定'name'字符串作为参数时才执行“ fixUrl”。 “ getAttribute('name')”。我怎样才能做到这一点?谢谢!

3 个答案:

答案 0 :(得分:0)

@AfterReturning(value = "execution(* de.ojk.platform.servicelayer.session.SessionService.getAttribute(..)) && args(String)")
public void after1(JoinPoint jp){
    System.out.println(jp.getArgs()[0]);
    System.out.println("after Return:"+jp.getSignature());
}

上述方法可以工作。如果要支持String以外的其他类型,请将String更改为所需的类型。 jp.getArgs()[0]获取变量! 以下您可以尝试的方式,我在我的代码中成功尝试了!

 @AfterReturning(value = "execution(@AfterReturning(value = "execution(* de.ojk.platform.servicelayer.session.SessionService.getAttribute(..)) && args(a)")
public void after2(JoinPoint jp,String a){
    System.out.println(a);
    System.out.println("after Return:"+jp.getSignature());
}

答案 1 :(得分:0)

您的要求是不可能的。方法切入点表达式可以根据签名和上下文来区分要加入或排除的方法。参数本身的值超出该范围。

无论如何,我认为将条件检查放入代码中是有好处的。它具有更强的抗破坏性,尤其是当您将要检查的值设为常量时。

答案 2 :(得分:0)

这是您的方面代码:

@AfterReturning("execution(* de.ojk.platform.servicelayer.session.SessionService.getAttribute(..))")
    public void fixUrl(JoinPoint p){
        String name;
        Object[] signatureArgs = p.getArgs();
        if (signatureArgs.length > 0) {
            Class baseRequestClass = signatureArgs[0].getClass();
            try {
                Method requestIdMethod = baseRequestClass.getMethod("name");
                name = requestIdMethod.invoke(signatureArgs[0]) != null
                        ? requestIdMethod.invoke(signatureArgs[0]).toString() : null;

                if (name != null) {
                    System.out.println("Provided Name :" + name);
                } else {
                    System.out.println("No Name parameter provided");
                }

            } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    } 

此处具有提供的值。如果为null,则不提供。我添加了 日志,有没有名字。

这是您的进口商品

import org.aspectj.lang.JoinPoint;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.concurrent.ExecutionException;