web-dev-qa-db-ja.com

ANDのSpringAOPポイントカット構文OR and NOT

Spring(バージョン2.5.6)でのポイントカット定義に問題があります。特定のメソッド(以下の例ではsomeMethod)を除いて、クラスへのすべてのメソッド呼び出しをインターセプトしようとしています。

<aop:config>
    <aop:advisor
         pointcut="execution(* x.y.z.ClassName.*(..)) AND NOT
                   execution(* x.y.x.ClassName.someMethod(..))"
    />
</aop:config>

ただし、インターセプターはsomeMethodに対しても呼び出されます。

それから私はこれを試しました:

<aop:config>
    <aop:advisor
         pointcut="execution(* x.y.z.ClassName.(* AND NOT someMethod)(..)) )"
    />
</aop:config>

しかし、これは有効な構文ではないためコンパイルされません(BeanCreationExceptionが発生します)。

誰かが何かヒントを与えることができますか?

18
Odinodin

この段階ではおそらく少し遅れていることはわかっていますが、同じ問題が発生しているので、アンパサンド文字をエスケープして&amp;&amp; !'ANDNOT 'または' &&! 'の代わりに。私はこれをxmlファイルで行っています

<aop:config>
    <aop:pointcut id="blah" expression="execution(* com.disney.goofy..*.*(..)) &amp;&amp; !@annotation(com.disney.goofy.NonDisneyCharacter)"/>
    <aop:advisor advice-ref="transAdvice" pointcut-ref="blah"/>
</aop:config>

これは、com.disney.goofyで実行され、NonDisneyCharacterアノテーションが付けられていないすべてのメソッドにアドバイスを適用します。

21
Declan

これは機能するはずです( 春のAOPリファレンス ):

pointcut="execution(* x.y.z.ClassName.*(..))
          && !execution(* x.y.x.ClassName.someMethod(..))"
5
crunchdog

私もSpring2.5.6を使用していて、[〜#〜] or [〜#〜]が機能しないという同様の問題がありましたが、[〜#〜] and [〜 #〜]動作していました。 または(小文字)は機能することが判明したため、そのコードには明らかにバグがあります。

適切なaspectJ構文が&&、、およびであるのは興味深いことですが、and/or/not構文はSpringによって追加されましたxmlでの作業を簡単にします。マニュアルから:

ポイントカットの部分式を組み合わせる場合、XMLドキュメント内で「&&」は扱いにくいため、「&&」、「||」の代わりにキーワード「および」、「または」および「not」を使用できます。および「!」それぞれ。

&&実際にxmlで厄介な唯一のものであるため(|またはを置くことについて難しいことは何もありません) !in xml)then [〜#〜] and [〜#〜]が適切にテストされた唯一のものです

1
James Scriven