如何使用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.IollegalArgumentException:切入点中:0处的错误网址:org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:301(~[aspectj.weaver-1.80.jar:1.8.0]

如果我删除第二个参数,我的应用程序就会正常启动。这是获得方法注释的正确方法吗?

如果要将切入点中的变量绑定到方法,则需要从切入点引用该变量。因此,与其写@annotation(your.CustomAnnotation),不如写@annotation(method-argument-name)

所以在你的情况下,你的切入点看起来像

@Before(“@annotation(annotation)”)
public void validateSearchRestriction(JoinPoint jp, MyCustomAnnotation annotation) { ... }

相关内容

  • 没有找到相关文章

最新更新