Подтвердить что ты не робот

Spring AOP Синтаксис Pointcut для AND, OR и NOT

У меня возникают проблемы с определением pointcut в 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).

Кто-нибудь может дать какие-либо советы?

4b9b3361

Ответ 1

Я знаю, что он, вероятно, немного опоздал на этом этапе, но у меня была такая же проблема, и я разрешил ее, избегая символов амперсандов, поэтому его &amp;&amp; ! вместо "AND NOT" или "& &!". Я делаю это в XML файле

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

Это относится ко всем методам, выполняемым в com.disney.goofy и которые не аннотируются с помощью NonDisneyCharacter

Ответ 2

Это должно работать (spring ссылка AOP):

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

Ответ 3

Я также использую spring 2.5.6 и имею аналогичную проблему с ИЛИ, но не работает И. Оказывается, что или (в нижнем регистре) работает, поэтому в этом коде есть ошибка.

Интересно, что правильный синтаксис aspectJ - &&, || и !, но и/не был добавлен синтаксис spring, чтобы упростить работу в xml. Из руководства:

При объединении pointcut вспомогательные выражения, && неудобно в XML-документе, и поэтому ключевые слова 'и', 'или' и 'не' могут быть используется вместо '&', '||' а также '!' соответственно.

Я бы предположил, что поскольку && является единственным, что на самом деле неудобно в xml (нет ничего сложного в том, чтобы положить | или! в xml), тогда И является единственным, который был правильно протестирован