【问题标题】:Spring AOP java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcutSpring AOP java.lang.IllegalArgumentException:::0 处的错误在切入点中正式未绑定
【发布时间】:2020-01-17 10:11:08
【问题描述】:

我想创建一个切面,它会拦截所有带有 MyAnnotation 注释并且参数类型为 MyAbstractObject 的方法(不同的类扩展它,并且那些具有扩展它的类的方法也应该被拦截)

@Before("@annotation(mypackage.MyAnnotation) && args(mypackage.MyAbstractObject ,..)")
public void doSomething(MyAbstractObject myObject) 

示例方法:

@MyAnnotation
public void toBeIntercepted(MyObjectExtendingMyAbstractObject x)

它仅适用于注释。但是我不得不从丑陋的关节点中提取参数。现在我正在改变它。

这会产生以下异常:

Caused by: java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut
    at org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:319) ~[aspectjweaver-1.9.4.jar:na]
    at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:227) ~[spring-aop-5.1.7.RELEASE.jar:5.1.7.RELEASE]
    at org.springframework.aop.aspectj.AspectJExpressionPointcut.obtainPointcutExpression(AspectJExpressionPointcut.java:198) ~[spring-aop-5.1.7.RELEASE.jar:5.1.7.RELEASE]
    at org.springframework.aop.aspectj.AspectJExpressionPointcut.getClassFilter(AspectJExpressionPointcut.java:177) ~[spring-aop-5.1.7.RELEASE.jar:5.1.7.RELEASE]
    at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:225) ~[spring-aop-5.1.7.RELEASE.jar:5.1.7.RELEASE]```

【问题讨论】:

    标签: java aop spring-aop


    【解决方案1】:

    args() 格式不正确。

    那个切入点表达式的正确格式如下

    @Before("@annotation(mypackage.MyAnnotation) && args(myObject,..)")
    public void doSomething(MyAbstractObject myObject) {}
    

    【讨论】:

    • 但是不同方法的参数名称会有所不同。是否可以将此表达式基于参数类型而不是参数名称?
    • args() 指示符适用于匹配参数类型。 spring aop中无法进行参数名称匹配
    • 这里的误解是关于advice方法中的参数名称。它确实对应于任何拦截方法中的参数名称,但仅用于为建议方法中的参数命名。
    猜你喜欢
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多