【问题标题】:Spring AOP Aspect advice with method parameters带有方法参数的 Spring AOP Aspect 建议
【发布时间】:2019-03-21 18:08:35
【问题描述】:

我有如下方面的建议

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

getAttribute 方法只接受一个字符串参数。

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

【问题讨论】:

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


    【解决方案1】:
    @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());
    }
    

    【讨论】:

    • 感谢您的回复,我正在寻找注释中的内容以赋予方法价值。我的意思是,我不想 if/else 在方法体内。只有通过了这个特定的方法才会执行。
    【解决方案2】:

    你问的是不可能的。方法切入点表达式在根据签名和上下文区分要加入或排除哪些方法方面非常强大。参数本身的值超出了该范围。

    无论如何,我认为在代码中加入条件检查是有好处的。它更能抵抗重构造成的破坏,尤其是当您将要检查的值设为常量时。

    【讨论】:

      【解决方案3】:

      这是你的方面代码:

      @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;
      

      【讨论】:

        猜你喜欢
        • 2017-11-19
        • 2016-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-13
        相关资源
        最近更新 更多