web-dev-qa-db-ja.com

AspectJ式は、ポイントカットエラーで正式にアンバインドされます

私はaspectJ式内にあります:

@Pointcut("within(com.param.cpms.dao.impl.ProjectMetaDaoImpl)")
public void daoExceptionHandle() {

}

Spring 3.0の起動時に、次のエラーが発生します

nested exception is Java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut
21
param

おそらく問題はあなたのポイントカットではなく、そのポイントカットを使用し、ポイントカットに存在しないパラメーターを使用するアドバイスにあります。アドバイスからパラメータを削除するだけです(まあ、またはポイントカットに追加します)。

27
kriegaex

投稿はかなり古いですが、@ Aroundアドバイスを使用する場合は、完全を期すために、別の理由を追加します。

Spring AspectJドキュメント によると、アドバイスの最初の引数はProceedingJoinPointでなければなりません。それがない場合は、まさにこの例外メッセージが表示されます。悲しいことに、この例外は誤ったアドバイスを指すものではないため、バグの解決は一見間違いです。

9
vacant78

ジョインポイント( "p小文字)

org.aopalliance.intercept.Joinpoint;

JointPoint( "P大文字)に変更します

org.aspectj.lang.JoinPoint; 
6
Dapper Dan

クラスのインポートが間違っているため、このエラーが発生しました。 import org.aspectj.lang.JoinPoint classをインポートする必要がありましたが、代わりに別のパッケージから他のJoinpointクラスをインポートしました。

5
Anshu Pandey

同じエラーが発生しましたが、私のシナリオでは2つのメソッドパラメータを使用していました

public void methodName(JoinPoint joinPoint ,HttpServletRequest request) throws

そして私の注釈は

@Before("execution(public * com.Java.controller.*Controller.*(..))")

私が追加したソリューションとして

args(リクエスト、..)

@Before("execution(public * com.Java.controller.*Controller.*(..)) && args(request,..)")
2
Urja Ramanandi

私にもこの問題があり、私の場合はorg.aopalliance.intercept.Joinpoint;からのインポートが間違っていました

次のようにする必要があります:org.aspectj.lang.JoinPoint;

2
Daejong Lin

時々理由はこれである可能性があります。

 public void afterReturning(JoinPoint joinPoint, Object result)

削除するだけObject result以下のように、それは私のために動作します。

public void afterReturning(JoinPoint joinPoint)
2
vipin cp

XMLベースの構成を使用していて、構成が次のようなものである場合:

<aop:config>
<aop:aspect ref="bAdvice">
    <aop:pointcut id="displayPointcut" expression="execution(* com.example.demo.BusinessClass.display())"/>
    <aop:before method="before" pointcut-ref="displayPointcut" />
</aop:aspect>
</aop:config>

次に、2つのシナリオで、エラーが発生します。

  1. ポイントカット式の場合、メソッド、つまりこの場合のdisplay()はパラメーターなしで定義されており、実際のクラスメソッドにはいくつかのパラメーターがあります。
  2. Beforeアドバイス、すなわちaop:before、method = "before"がarg-namesなしで定義されていて、実際のアドバイスクラスでは、メソッド "before"にいくつかのパラメーターがあります。

最終的に、XMLで定義されたメソッドパラメータが実際のメソッドと一致しない場合、このエラーが発生します。

1
Kishan Panchal

これはあなたの答えではありませんが、少し役立つかもしれません。

Spring AOPチュートリアル このチュートリアルを参照できます

@Before("execution(* com.de.controller..*(..))")
public void beforeLoggerAdvice(JoinPoint joinPoint, WebRequest request) {
    DeUtil.looger.info("--working");
}

同じ例外が発生しましたが、WebRequestのため、それを削除して代替を使用しました

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
1
Bhushan Dafale

ポイントカットの正式な非バインド例外は、AOPの2つの応答でも発生します。

理由1:にreturnステートメントがない場合アドバイスを返した後

XMLベースの実装の場合

<aop:aspect id="myaspect" ref="trackAspect">
<aop:pointcut id="pointCutAfterReturning" expression="execution(* com.springlearn.Operation.*(..))" />
<aop:after-returning method="myAdvice"  returning="result" pointcut-ref="pointCutAfterReturning"/>  //Make sure returning result is added
</aop:aspect>

注釈ベースの実装の場合

@AfterReturning(  
              pointcut = "execution(* Operation.*(..))",  
              returning= "result") //Make sure returning result is added

理由2:投球がない場合投球後のアドバイス

XMLベースの実装の場合

<aop:aspect id="myaspect" ref="trackAspect" >  
     <!-- @AfterThrowing -->  
     <aop:pointcut id="pointCutAfterThrowing"    expression="execution(* com.javatpoint.Operation.*(..))" />  
     <aop:after-throwing method="myadvice" throwing="error" pointcut-ref="pointCutAfterThrowing" />  //Make sure throwing error is added
  </aop:aspect> 

注釈ベースの実装の場合

@AfterThrowing(  
              pointcut = "execution(* Operation.*(..))",  
              throwing= "error")  //Make sure throwing error is added
1
Gani