【问题标题】:Get Annotation Parameter with AspectJ使用 AspectJ 获取注释参数
【发布时间】:2015-08-15 22:19:06
【问题描述】:

我在这个论坛上阅读了很多问题,但没有任何效果。

public @interface MyAnnotation {
    String value() default "";
    Class[] exceptionList;
}

@MyAnnotation(value="hello", exceptionList={TimeOutException.class})
public void method() {}


@Aspect
public class MyAspect {
    @Around("@annotation(MyAnnotation)")
    public Object handle(ProceedingJoinPoint joinPoint, MyAnnotation myAnnotation) {
        System.out.println(myAnnotation.exceptionList); // should print out TimeOutException
    }
}

如何在执行建议时获得@MyAnnotationvalueexceptionList? 我正在使用 Spring 4.0.6、AspectJ 1.7.4

【问题讨论】:

  • 请显示“MyAnnotation”的内容

标签: aspectj spring-aop


【解决方案1】:

解决方案是确保通知方法的参数名称与 AspectJ 表达式中的参数名称匹配。在我的例子中,advice 方法应该是这样的:

@Aspect
public class MyAspect {
    @Around("@annotation(myAnnotation)")
    public Object handle(ProceedingJoinPoint joinPoint, MyAnnotation myAnnotation) {
        System.out.println(myAnnotation.exceptionList); // should print out TimeOutException
    }
}

【讨论】:

    【解决方案2】:

    你已经快到了。可能。

    您正在使用正确的方法来检索注释,因此您有可用的值。

    您的问题 - 如果我解释了非常简约的问题描述(!),您只能通过代码 sn-p(!)中的注释正确地提供 - 是(错误)假设坚持将 Class 类型的数组放入 System.out.println() 将打印出它包含的类的名称。 它没有。而是打印有关参考的信息:

    [Ljava.lang.Class;@15db9742
    

    如果您想要类的名称,则必须遍历该数组的元素并使用 .getName()、.getSimpleName() 或提供 Class 的其他名称方法之一。

    关于如何打印数组元素的更多信息在这里:

    What's the simplest way to print a Java array?

    当然,如果问题是您从注释字段中获取空值,那么整个答案可能完全不重要。但由于您没有提供足够的问题描述(“没有任何作用”不是问题描述!),我们只能猜测您的问题是什么。

    【讨论】:

    • 嗨谢尔特姆。 “没有任何效果”意味着 IDE 抱怨“切入点中的正式未绑定”。幸运的是,我找到了根本原因:@Around("@annotation(MyAnnotation)") 应该是 @Around("@annotation(myAnnotation)")。因为advice方法的参数名是myAnnotation。
    • 嗯。很高兴你能找到它,这是我错过的一个细节。我仍然会留下这个答案,以提醒您下次提供完整的问题描述,包括所有 IDE 错误输出。 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    相关资源
    最近更新 更多