问题
I am new to AOP. I got some problem like this.
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(){}
}
when using pointcut, the method allGetters()
to LoginAdvice
method, if I use @Before("execution(* get*())")
then no error but if I use @Before("allGetters()")
then gives error
java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut allGetters
if I use @Before("execution(* get*())&& within(org.suman.Model.Circle)")
instead of method name it works.
My xml like this:
<?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>
Please solve the problem with pointcut by which it takes method
回答1:
I had this problem - using @Pointcut on a 'placeholder' method was giving me the "can't find referenced pointcut" error.
Solved simply by updating the AspectJ libraries with the maven dependencies from this:
<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>
to this
<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>
回答2:
I ran thjrough the same problem. Once i replace the aspectjweaver with the aspectjweaver-1.6.11.M2.jar version. Everything started working smoothly.
回答3:
The problem can also be caused by running an early access version of JDK9.
Maven might be preferring a newer version of Java over the JVM in PATH
.
In my case I'm running Spring with Swagger2 via Maven on Ubuntu 15.04, and I have installed java-8-oracle
and java-9-oracle
(and a few more versions). My java -version
, derived from PATH
, says 1.8.0_72
, yet when I run Maven and change /usr/bin/mvn
to echo JAVA_HOME
, it shows to have selected /usr/lib/jvm/java-9-oracle
.
Exporting JAVA_HOME
to /usr/lib/jvm/java-8-oracle
made Maven use the desired version of Java, and that made the problems with AOP weaving of pointcuts for Spring's dependency injection wiring go away.
回答4:
Use aspectjweaver and aspectjrt versions 1.8.10
回答5:
I believe you need to put another wildcard in front of:
@Pointcut("execution(* get*())")
change it to:
@Pointcut("execution(* *get*())")
回答6:
You should change the aspectJWeaver version to be 1.6.x
回答7:
I had this issue because the project was compiled in Java 1.6, but tomcat server started in Java 8.
回答8:
I also got similar issue with @Before advice not accepting @Pointcut method name as argument. I got this fixed by changing the dependencies version to:
<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>
Its working fine for me now.
回答9:
It is the problem of dependencies. Following jars or dependencies of the exactly same version should be used to avoid such problems:
<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:
Add this maven dependencies. This will resolve your issue.
Change the version to 1.6.12
回答11:
Change the aspectjeaver version to latest and deploy it...
来源:https://stackoverflow.com/questions/10482563/aop-java-lang-illegalargumentexception-error-at-0-cant-find-referenced-poi