【问题标题】:advice defined has not been applied : Aspectj Pointcut未应用定义的建议:Aspectj Pointcut
【发布时间】:2014-12-10 07:04:34
【问题描述】:

我正在尝试创建一个注释来记录带注释的类中的所有方法,但是我的切入点有问题,它没有被应用(AspectJ 版本 1.7.4,aspectj-maven-plugin 版本 1.7)。

(advice defined in com.test.util.log.Logger has not been applied
[Xlint:adviceDidNotMatch]).

切入点:

@Pointcut(value = "execution(* (@Loggable *).*(..))"))

注释:

@Retention(RetentionPolicy.RUNTIME)
@Target(value = { ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.TYPE })
public @interface Loggable {
    public enum Level {
        TRACE, DEBUG, INFO, WARN, ERROR, FATAL
    };

    boolean entry() default true;
    boolean exit() default true;
    String prefix() default "";
    String suffix() default "";
    Level level() default Level.DEBUG;
}

谢谢

【问题讨论】:

    标签: maven aop aspectj pointcut aspectj-maven-plugin


    【解决方案1】:

    我假设注释不在未命名的顶级包中,而是在像com.company.application.subpackage 这样的包中。如果这是真的,您需要在注释样式@AspectJ 中使用完全限定的包名称。在本机语法中,这不是必需的,因为您可以在那里使用导入。所以切入点应该是:

    @Pointcut("execution(* (@com.company.application.subpackage.Loggable *).*(..))"))
    

    您使用括号的方式使切入点仅匹配由@Loggable 注释的 的方法。注解的@Target 定义说它也可以应用于方法和构造函数。这些将不会与您的切入点匹配,您必须为此目的对其进行修改。我希望你知道,我只是为了安全起见。

    【讨论】:

    • 我有两种情况:1)注解 class=> 切入点需要匹配这个类中的所有方法 2)注解方法=> 切入点只需要匹配被注解的方法
    • Ich 可以帮助您解决这两个问题,没问题。但是案例 #1 的切入点有效吗?告诉我,首先为了排除其他根本原因,然后我们不能继续案例#2。
    【解决方案2】:

    [Xlint:adviceDidNotMatch]) 表示您的切入点未应用于编译的项目。很可能您没有将注释放在任何方法上。

    PS 我也建议不要重新发明轮子并尝试 aspect4log

    【讨论】:

      【解决方案3】:
      before(): execution(* YourOwnPackage.*.*(..))
      {
           //packages is com
          System.out.println(" TEST");    
      
      }
      

      以此为起点,寻找自己的建议。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多