如何使用 AspectJ 访问建议内的方法注释?
How to access method annotation inside an advice using AspectJ?
我使用 AspectJ
创建了一个方面来在执行之前拦截某些方法,如下所示
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class SomeAspect {
@Before("@annotation(com.test.package.MyCustomAnnotation)")
public void validateSearchRestriction(final JoinPoint jp,
final MyCustomAnnotation annotation) {
final String useCase = annotation.useCase();
}
}
编写的自定义注解如下
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.stereotype.Component;
@Component
@Target(value = { ElementType.METHOD, ElementType.TYPE })
@Retention(value = RetentionPolicy.RUNTIME)
public @interface SecurityRestricted {
String useCase();
}
我面临的问题是我的方法中的第二个参数。
如果我尝试在我的方面获取注释作为第二个参数,应用程序将无法启动并出现以下错误。
bean初始化失败;嵌套异常是 java.lang.IllegalArgumentException:::0 处的错误在切入点
中正式未绑定
原因:java.lang.IllegalArgumentException:::0 切入点正式未绑定时出错
在 org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:301) ~[aspectjweaver-1.8.0.jar:1.8.0]
如果删除第二个参数,我的应用程序将正常启动。
这是获取方法注释的正确方法吗?
如果您想将变量从切入点绑定到方法,您将需要从切入点引用变量。所以不要写 @annotation(your.CustomAnnotation)
你应该写 @annotation(method-argument-name)
.
所以在你的情况下你的切入点看起来像
@Before(“@annotation(annotation)”)
public void validateSearchRestriction(JoinPoint jp, MyCustomAnnotation annotation) { ... }
我使用 AspectJ
创建了一个方面来在执行之前拦截某些方法,如下所示import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class SomeAspect {
@Before("@annotation(com.test.package.MyCustomAnnotation)")
public void validateSearchRestriction(final JoinPoint jp,
final MyCustomAnnotation annotation) {
final String useCase = annotation.useCase();
}
}
编写的自定义注解如下
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.stereotype.Component;
@Component
@Target(value = { ElementType.METHOD, ElementType.TYPE })
@Retention(value = RetentionPolicy.RUNTIME)
public @interface SecurityRestricted {
String useCase();
}
我面临的问题是我的方法中的第二个参数。 如果我尝试在我的方面获取注释作为第二个参数,应用程序将无法启动并出现以下错误。
bean初始化失败;嵌套异常是 java.lang.IllegalArgumentException:::0 处的错误在切入点
中正式未绑定原因:java.lang.IllegalArgumentException:::0 切入点正式未绑定时出错 在 org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:301) ~[aspectjweaver-1.8.0.jar:1.8.0]
如果删除第二个参数,我的应用程序将正常启动。 这是获取方法注释的正确方法吗?
如果您想将变量从切入点绑定到方法,您将需要从切入点引用变量。所以不要写 @annotation(your.CustomAnnotation)
你应该写 @annotation(method-argument-name)
.
所以在你的情况下你的切入点看起来像
@Before(“@annotation(annotation)”)
public void validateSearchRestriction(JoinPoint jp, MyCustomAnnotation annotation) { ... }