12

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

方法がとれるポイントカットで問題を解いてください

4

13 に答える 13

27

「プレースホルダー」メソッドで @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>
于 2012-09-27T20:46:28.490 に答える
3

私は同じ問題を経験しました。一度、aspectjweaver を aspectjweaver-1.6.11.M2.jar バージョンに置き換えます。すべてがスムーズに機能し始めました。

于 2013-01-29T00:44:12.087 に答える
2

この問題は、早期アクセス バージョンの JDK9 を実行することによっても発生する可能性があります。

Maven は、.NET の JVM よりも新しいバージョンの Java を好む可能性がありますPATH

私の場合、Ubuntu 15.04 で Maven 経由で Swagger2 を使用して Spring を実行しており、java-8-oracleand java-9-oracle(およびさらにいくつかのバージョン) をインストールしています。Myjava -versionは、から派生したPATHと言って1.8.0_72いますが、Maven を実行して に変更/usr/bin/mvnするとecho JAVA_HOME、 が選択されていることが示され/usr/lib/jvm/java-9-oracleます。

Maven にエクスポートJAVA_HOMEすると/usr/lib/jvm/java-8-oracle、必要なバージョンの Java が使用され、Spring の依存性注入の配線のためのポイントカットの AOP ウィービングの問題が解消されました。

于 2016-01-27T17:41:25.467 に答える
0

spectJWeaver のバージョンを 1.6.x に変更する必要があります。

于 2012-08-04T19:26:27.423 に答える
0

次の前に別のワイルドカードを配置する必要があると思います。

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

次のように変更します。

@Pointcut("execution(* *get*())")
于 2012-05-07T13:07:36.673 に答える
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>
于 2019-03-13T14:22:23.227 に答える