AOP:java.lang.IllegalArgumentException::: 0处的错误找不到引用的切入点

问题描述 投票:9回答:10

我是AOP的新手。我有这样的问题。

package org.suman.Aspect;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class LoginAspect {
    //@Before("execution(public String getName())")
    //@Before("execution(public String org.suman.Model.Triangle.getName())")
    //@Before("execution(* get*())")
    //@Before("execution(* get*(..))")
    //@Before("execution(* org.suman.Model.*.get*())")

    //@Before("execution(* get*())&& within(org.suman.Model.Circle)")
    @Before("execution(* get*())&& allCircle()")
    //@Before("allGetters() && allCircle()")
    public void LoginAdvice()
    {
        System.out.println("Advice run.. getMethod is called");
    }

    @Before("execution(* get*())")
    //@Before("allGetters()")
    public void SecondAdvice()
    {
        System.out.println("this is a second Advice");
    }
    @Pointcut("execution(* get*())")
    public void allGetters(){}

    //@Pointcut("execution (* * org.suman.Model.Circle.*(..))")
    @Pointcut("within(org.suman.Model.Circle)")
    public void allCircle(){}

} 

当使用切入点时,方法allGetters()为LoginAdvice方法,如果我使用@Before(“execution(* get *())”然后没有错误但是如果我使用@Before(“allGetters()”)则会给出错误“ java.lang.IllegalArgumentException::: 0处的错误找不到引用的切入点allGetters

如果我使用@Before(“execution(* get *())&&(org.suman.Model.Circle)”)而不是方法名称,它可以工作。

我的xml是这样的:

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
    <!-- <context:annotation-config /> -->
    <aop:aspectj-autoproxy />

    <bean name="triangle" class="org.suman.Model.Triangle">
        <property name="name" value="Triangle Name"></property>
    </bean>
    <bean name="circle" class="org.suman.Model.Circle">
        <property name="name" value="Circle name"></property>
    </bean>
    <bean name="shapeService" class="org.suman.Services.ShapeService"
        autowire="byName"></bean>
    <bean name="loginAspect" class="org.suman.Aspect.LoginAspect"></bean>

</beans>

请通过切入点解决问题的方法

spring-aop
10个回答
24
投票

我有这个问题 - 在'占位符'方法上使用@Pointcut给了我“找不到引用的切入点”错误。

简单地通过使用maven依赖项更新AspectJ库来解决:

    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.5.4</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.5.4</version>
    </dependency>

对此

    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.7.0</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.7.0</version>
    </dependency>

-1
投票

将aspectjweaver版本更改为最新版本并部署它...


3
投票

我遇到了同样的问题。一旦我用aspectjweaver-1.6.11.M2.jar版本替换aspectjweaver。一切都开始顺利进行。


2
投票

运行早期访问版本的JDK9也可能导致此问题。

PATH中,Maven可能更喜欢在JVM上使用较新版本的Java。

在我的情况下,我在Ubuntu 15.04上通过Maven运行Spring with Swagger2,我已经安装了java-8-oraclejava-9-oracle(还有一些版本)。我的java -version,源自PATH,说1.8.0_72,但当我运行Maven并将/usr/bin/mvn改为echo JAVA_HOME时,它显示选择了/usr/lib/jvm/java-9-oracle

JAVA_HOME导出到/usr/lib/jvm/java-8-oracle使得Maven使用了所需的Java版本,这使得AOP编织Spring的依赖注入接线切入点的问题消失了。


1
投票

使用aspectjweaver和aspectjrt版本1.8.10


0
投票

我相信你需要在前面加上另一张外卡:

@Pointcut("execution(* get*())")

将其更改为:

@Pointcut("execution(* *get*())")

0
投票

您应该将aspectJWeaver版本更改为1.6.x.


0
投票

我有这个问题因为项目是用Java 1.6编译的,但tomcat服务器是用Java 8开始的。


0
投票

我也有类似的问题@Before建议不接受@Pointcut方法名称作为参数。我通过将依赖项版本更改为:

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>1.6.11</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.6.11</version>
</dependency>

它现在对我来说很好。


0
投票

这是依赖性的问题。应使用以下完全相同版本的jar或依赖项来避免此类问题:

<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.5.2</version>
</dependency>

<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.10</version>
</dependency>

<dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<version>3.3.1</version>
</dependency>

<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>

<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>
© www.soinside.com 2019 - 2024. All rights reserved.