如何在Spring AOP中拦截元注解(annotated annotations)。换句话说,如何使用aspectj语法匹配方法上的元注解

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

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

上面的相关代码

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 {}

但只有当元注释被添加到类型时,它才有效。现在希望在方法上使用注解的时候,也能被asepct拦截

下面的表达式可以拦截类型上使用的所有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.MetaAnnotation *)*)” +

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

还有一些类似的组合,但是都会报错:aspect expression cannot be parsed

想知道什么样的表达式可以拦截method上注解的meta注解

java spring annotations aspectj spring-aop
1个回答
0
投票

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

经过多次尝试,使用这个表达式可以完成上述功能

© www.soinside.com 2019 - 2024. All rights reserved.