【问题标题】:AOP : java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcutAOP : java.lang.IllegalArgumentException: ::0 处的错误找不到引用的切入点
【发布时间】:2012-05-07 13:00:39
【问题描述】:

我是 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*())&& within(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


【解决方案1】:

我遇到了这个问题 - 在“占位符”方法上使用 @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.5.4 和 1.7.0 上会失败:stackoverflow.com/a/15683358/253468
  • 很酷...它不寻常,但是是的,更改为最新的对我有用...谢谢@Forge_7
  • 我正在使用 java8 ,尝试使用 aspectj 1.7.0 和 1.8.10 但仍然面临问题
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    该问题也可能是由于运行早期访问版本的 JDK9 引起的。

    PATH 中的 JVM 相比,Maven 可能更喜欢更新版本的 Java。

    就我而言,我在 Ubuntu 15.04 上通过 Maven 使用 Swagger2 运行 Spring,并且我已经安装了 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 版本,这使得 Spring 的依赖注入布线的切入点的 AOP 编织问题消失了。

    【讨论】:

      【解决方案4】:

      使用 aspectjweaver 和 aspectjrt 版本 1.8.10

      【讨论】:

        【解决方案5】:

        在不同的用例中遇到相同的错误。

        用例:试图调用存在于不同方面类中的切入点。

        LogServicePointCut1() 切入点出现在 LogService 中

        package com.opensource.kms;
        @Aspect
        @Component
        public class LogService {
            
            @Pointcut("execution(* com.opensource.kms.AccountService.my*(..))")
            public void logServicePointCut1() {
            }
        }
        

        尝试调用SecurityService

        @Aspect
        @Component
        public class SecurityService {
        
            @Before("logServicePointCut1()")  /*Need to give fully Qualified name*/
            public void verifyUserBeforeSecurityService() {
                System.out.println("verifyUserBeforeSecurityService");
            }
        }
        

        解决方法:需要传递全称com.opensource.kms.LogService.logServicePointCut1()

        希望这对某人有帮助!

        【讨论】:

          【解决方案6】:

          我相信你需要在前面加上另一个通配符:

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

          改成:

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

              我遇到这个问题是因为项目是在 Java 1.6 中编译的,但是 tomcat 服务器是在 Java 8 中启动的。

              【讨论】:

                【解决方案9】:

                @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>
                

                它现在对我来说工作正常。

                【讨论】:

                  【解决方案10】:

                  这是依赖关系的问题。应使用以下完全相同版本的 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>
                  

                  【讨论】:

                  • 它们对于 AOP 是相互兼容的。
                  【解决方案11】:

                  添加这个maven依赖。 这将解决您的问题。

                  将版本改为1.6.12

                  【讨论】:

                  • 什么是“这个 Maven 依赖项”?更改什么版本?
                  【解决方案12】:

                  请使用下面的 maven 依赖项 - 我希望它能工作

                  1. aspectjrt 1.8.14
                  2. aspectjweaver 1.8.14
                  <dependency>
                      <groupId>org.aspectj</groupId>
                      <artifactId>aspectjrt</artifactId>
                      <version>1.8.14</version>
                  </dependency>
                  
                  <dependency>
                      <groupId>org.aspectj</groupId>
                      <artifactId>aspectjweaver</artifactId>
                      <version>1.8.14</version>
                      <scope>runtime</scope>
                  </dependency>
                  

                  【讨论】:

                    【解决方案13】:

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

                    【讨论】:

                    • 请通过解释您的帖子解决问题的原因来改进您的帖子。
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-06-14
                    相关资源
                    最近更新 更多