2012-05-07 28 views
7

Tôi mới sử dụng AOP. Tôi có một số vấn đề như thế này.AOP: java.lang.IllegalArgumentException: lỗi tại :: 0 không thể tìm thấy điểm tham chiếu

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(){} 

} 

khi sử dụng pointcut, các allGetters phương pháp() để phương pháp LoginAdvice, nếu tôi sử dụng @Before ("thực thi (* get *())") sau đó không có lỗi nhưng nếu tôi sử dụng @Before ("allGetters () ") sau đó mang lại cho lỗi" java.lang.IllegalArgumentException: lỗi tại :: 0 allGetters pointcut không thể tìm thấy tham chiếu

nếu tôi sử dụng @Before ("thực thi (* get *()) & & trong (org. suman.Model.Circle) ") thay vì tên phương thức hoạt động.

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> 

Hãy giải quyết vấn đề với pointcut mà phải mất phương pháp

+0

Đối với những người đã đến chủ đề này và không có giải pháp được đề xuất nào trên trang này hoạt động, hãy thử xem xét tại đây: https://stackoverflow.com/questions/21279716/error-at-0-cant-find-referenced chú thích -pointcut – rj2700

Trả lời

0

Tôi tin rằng bạn cần phải đặt ký tự đại diện khác ở phía trước:

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

thay đổi nó để:

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

Nó cho cùng một lỗi – user1379705

-1

Thay đổi phiên bản phần tử theo chiều mới nhất và triển khai nó ...

+3

Vui lòng cải thiện bài đăng của bạn bằng cách giải thích lý do bài viết của bạn giải quyết được vấn đề. –

0

Bạn s Thay đổi phiên bản aspectJWeaver thành 1.6.x

22

Tôi đã gặp sự cố này - bằng cách sử dụng @Pointcut trên phương thức 'trình giữ chỗ' đã cho tôi lỗi "không thể tìm thấy điểm tham chiếu".

Giải Quyết đơn giản bằng cách cập nhật các thư viện AspectJ với sự phụ thuộc maven từ này:

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

này

<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> 
+3

Đối với những người tò mò tại sao nó thất bại với 1.5.4 và làm việc với 1.7.0: http://stackoverflow.com/a/15683358/253468 – TWiStErRob

+0

Khá tuyệt ... sự khác thường của nó nhưng thay đổi để làm việc mới nhất cho tôi ... cảm ơn @ Forge_7 –

+1

tôi đang sử dụng java8, đã thử với aspectj 1.7.0 và 1.8.10 nhưng vẫn phải đối mặt với vấn đề – Gopal

3

Tôi chạy thjrough cùng một vấn đề. Một khi tôi thay thế các aspectjweaver với phiên bản aspectjweaver-1.6.11.M2.jar. Mọi thứ bắt đầu hoạt động trơn tru.

1

Sự cố cũng có thể xảy ra do chạy phiên bản truy cập sớm của JDK9.

Maven có thể thích phiên bản Java mới hơn trên JVM trong PATH.

Trong trường hợp của tôi, tôi đang chạy Spring with Swagger2 qua Maven trên Ubuntu 15.04 và tôi đã cài đặt java-8-oraclejava-9-oracle (và một vài phiên bản khác). My java -version, có nguồn gốc từ PATH, nói 1.8.0_72, nhưng khi tôi chạy Maven và thay đổi /usr/bin/mvn thành echo JAVA_HOME, nó cho thấy đã chọn /usr/lib/jvm/java-9-oracle.

Xuất JAVA_HOME thành /usr/lib/jvm/java-8-oracle làm cho Maven sử dụng phiên bản Java mong muốn và điều này đã làm cho các vấn đề với AOP dệt các phím tắt cho hệ thống phun phụ thuộc của Spring biến mất.

0

Tôi gặp sự cố này vì dự án được biên dịch trong Java 1.6, nhưng máy chủ tomcat đã bắt đầu bằng Java 8.

0

Tôi cũng gặp vấn đề tương tự với @Trước khi lời khuyên không chấp nhận tên phương thức @Pointcut làm đối số. Tôi đã khắc phục sự cố này bằng cách thay đổi phiên bản phụ thuộc thành:

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

Làm việc tốt cho tôi ngay bây giờ.