使用方法参数的Spring AOP Aspect建议

问题描述 投票:1回答:3

我有一个像下面这样的方面建议

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

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

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

spring spring-mvc aop aspectj spring-aop
3个回答
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());
}

0
投票

你问的是不可能的。方法切入点表达式在区分基于签名和上下文的加入或排除方法方面非常有用。参数本身的值超出了该范围。

无论如何,我认为将条件检查放入代码中是有好处的。它更能抵抗重构的破坏,特别是如果你创造了你正在检查的常数值。


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;
© www.soinside.com 2019 - 2024. All rights reserved.