如何使用AspectJ访问建议中的方法注释?

时间:2018-11-05 19:25:42

标签: spring annotations aspectj interceptor

我创建了一个方面,以使用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]

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

1 个答案:

答案 0 :(得分:1)

如果要将切入点的变量绑定到方法,则需要引用切入点的变量。因此,您应该写onBeforeRendering: function() { var oSmartFilter = this.getView().byId("SmartFilter"); var oJSONData = { Days:{ operator: "EQ", low:"5"}}; oSmartFilter.setFilterData(oJSONData, true); 而不是写@annotation(your.CustomAnnotation)

因此,在您的情况下,切入点看起来像

@annotation(method-argument-name)