我是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(“执行(* get *())&& in(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>
请解决方法
的切入点问题答案 0 :(得分: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 :(得分:3)
我遇到了同样的问题。一旦我用aspectjweaver-1.6.11.M2.jar版本替换aspectjweaver。一切都开始顺利进行。
答案 2 :(得分:2)
运行早期访问版本的JDK9也可能导致问题。
Maven可能更喜欢在PATH
的JVM上使用较新版本的Java。
在我的情况下,我在Ubuntu 15.04上通过Maven运行Spring with Swagger2,我已经安装了java-8-oracle
和java-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的依赖注入接线的切入点的问题消失了。
答案 3 :(得分:1)
使用aspectjweaver和aspectjrt版本1.8.10
答案 4 :(得分:1)
在不同的用例中遇到相同的错误。
UseCase:试图调用存在于不同方面类中的切入点。
LogService中存在logServicePointCut1()切入点
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()
希望这对某人有帮助!
答案 5 :(得分:0)
我相信你需要在前面添加另一张通配符:
@Pointcut("execution(* get*())")
将其更改为:
@Pointcut("execution(* *get*())")
答案 6 :(得分:0)
您应该将aspectJWeaver版本更改为1.6.x
答案 7 :(得分:0)
我遇到了这个问题,因为该项目是在Java 1.6中编译的,但是tomcat服务器是在Java 8中启动的。
答案 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>
现在它对我来说很好。
答案 9 :(得分: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>
答案 10 :(得分:0)
添加此Maven依赖项。 这样可以解决您的问题。
将版本更改为 1.6.12
答案 11 :(得分:0)
请使用下面的 maven 依赖项 - 我希望它能工作
<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>
答案 12 :(得分:-1)
将aspectjweaver版本更改为最新版本并部署它......