2011-12-14 5 views
2

コマンドラインまたはeclipseからmvnパッケージを実行すると、このエラーが発生します。Spring AOP - AspectJ Error: '||'に渡るパラメータセッションのあいまいなバインディングin pointcut

私がmvnパッケージを3〜4回実行すると、エラーは表示されなくなり、ビルドは正常に完了します。また、eclipseには、(パッケージエクスプローラで)ポイントカットが定義されているファイルに赤い 'x'がありますが、ファイルを開くときにエラーはありません。ポイントカット。 '||'の2つのポイントカットは、が使用されています:

@Pointcut("((execution(gr.diassa.dslibweb.data.dto.GenericGrid gr.diassa.dslibweb.controller.*.*(..)) && args(session,..)) || (execution(gr.diassa.dslibweb.data.dto.GenericGrid gr.diassa.dslibweb.controller.*.*(..)) && args(..,session))) && excludeInitControllerMethods()") 
public void controllerActionForMethodsThatReturnJsonString(HttpSession session) { 

} 

@Pointcut("((execution(org.springframework.web.servlet.ModelAndView gr.diassa.dslibweb.controller.*.*(..)) && args(session,..)) || (execution(org.springframework.web.servlet.ModelAndView gr.diassa.dslibweb.controller.*.*(..)) && args(..,session))) && excludeInitControllerMethods()") 
public void controllerActionForMethodsThatReturnModelAndView(HttpSession session) { 

} 

私はこれまでに何の類似点も見つけられませんでしたか?

+0

エラーは何ですか? –

答えて

4

これはコンパイラによって指摘された有効な問題ですが、実際のP​​OVからのAspectJの欠点もあります。

注意点は、ポイントカットを使用してアドバイスをバインドするだけでなく、対応するポイントカットからいくつかのパラメータ値を取得しようとしていることです。今問題は2つの代替シナリオ(||)を定義していることです。残念ながらかもしれないかもしれません。両方のシナリオが適用されます。これは、アドバイスの照合と定義のための問題ではありません。しかし、パラメータ値を選択したいので、AspectJはの両方がのブランチが有効なときに何をすべきかを知らない。あなたの例では

二つの異なるsession開始時のパラメータおよびパラメータリストの最後を取る方法があるかもしれません。このようなメソッドは、ポイントカットの両方の代替分岐に一致します。このセッションでは、AspectJが返すものとするセッションはどれですか?

これはすべて理にかなっていますが、実用的なPOVからは、これはしばしば欠点として判明します。

  • このようなポイントカットの作成を開始するときは、一般的なことですが、あなたが必要とする特定のオブジェクトが常に同じか、少なくとも違いは問題ではないことが分かります。または、最初の該当するブランチからの一致(「短絡評価」)を得て、それ以上のマッチを気にしないと仮定している場合
  • 私がヒットしたすべてのケースで、AspectJはではないこれが静的に導かれる場合であっても、2つの枝が互いに素であることを意味する。
  • このバグも参照してください。https://bugs.eclipse.org/bugs/show_bug.cgi?id=121805(2005年、2014年再開)このようなものを実装するのは手間がかかり、正しいことが難しいようです。このバグは、(それがあるべきように)この問題が一貫検出されない理由を説明

だから、唯一の救済は、各ブランチのための明確なポイントカットにあなたのポイントカットを分割するとするために別々のアドバイスを書くことであるかもしれません各支店毎に。通常、これらのアドバイスから共通の実装方法に委任したいと考えています。 Uggly、実際にこの問題を回避します

関連する問題