21

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 が発生します)。

誰でもヒントを教えてもらえますか?

4

3 に答える 3

21

この段階ではおそらく少し遅れていることはわかっていますが、同じ問題が発生しているので、アンパサンド文字をエスケープして、&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で注釈が付けられていないすべてのメソッドにアドバイスが適用されます。

于 2010-05-07T15:10:29.393 に答える
6

これはうまくいくはずです(春のAOP参照):

pointcut="execution(* x.y.z.ClassName.*(..))
          && !execution(* x.y.x.ClassName.someMethod(..))"
于 2010-02-15T15:29:34.193 に答える
2

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

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

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

&&はxmlで実際に厄介な唯一のものであるため(xmlに|または!を入れるのは難しいことではありません)、適切にテストされたのはANDだけだと思います

于 2011-06-16T15:27:13.213 に答える