如何在Spring AOP中拦截元注释(带注释的注释).换句话说,如何使用aspectj语法来匹配方法上的元注释.<



这个问题以前已经部分解决了,我提出的问题建立在这个问题的答案之上参考:如何在Spring AOP中拦截元注释(带注释的注释)

以上相关规范

package de.scrum_master.app;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@Retention(RUNTIME)
@Target({ TYPE })
public @interface MetaAnnotation {}
package de.scrum_master.app;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@Retention(RUNTIME)
@Target({ TYPE })
@MetaAnnotation
public @interface MyAnnotation {}

,但只有当元注释添加到类型时,它才有效。现在我希望当在方法上使用注释时,它也可以被asepect截获。

下面的表达式可以拦截type上使用的所有MetaAnnotation,但它不能应用于方法

package de.scrum_master.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class MetaAnnotationInterceptor {
@Before(
"execution(* *(..)) && (" +
"within(@de.scrum_master.app.MetaAnnotation *) || " +
"within(@(@de.scrum_master.app.MetaAnnotation *) *)" +
")"
)
public void myAdvice(JoinPoint thisJoinPoint){
System.out.println(thisJoinPoint);
}
}

我试着

"注释(@de.scrum_master.app。MetaAnnotation *) || "+"注释(@ (@de.scrum_master.app。元注释*)*)"+

"@annotation(de.scrum_master.app.MetaAnnotation) || "+"@annotation (@annotation (de.scrum_master.app.MetaAnnotation)),+

和一些类似的组合,但是它们都会报告一个错误:方面表达式不能被解析

我想知道什么样的表达式可以拦截在方法

上标注的元注释

执行(@(@de.scrum_master.app.)MetaAnnotation *) * *(..))

经过多次尝试后,可以使用这个表达式

完成上面的函数

最新更新