22

I'm having trouble with a pointcut definition in Spring (version 2.5.6). I'm trying to intercept all method calls to a class, except for a given method (someMethod in the example below).

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

However, the interceptor is invoked for someMethod as well.

Then I tried this:

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

But this does not compile as it is not valid syntax (I get a BeanCreationException).

Can anybody give any tips?

Odinodin
  • 2,147
  • 3
  • 25
  • 43
  • Have you considered writing the aspect logic with @AspectJ style instead? It's much simpler and more powerful to write the aspect logic with Java. Especially if you're using Eclipse with the AJDT plugin. – Espen Apr 26 '10 at 10:24

3 Answers3

23

i know its probably a bit late at this stage but ive been having the same issue and I resolved it by escaping the ampersand chars so its &amp;&amp; ! instead of 'AND NOT' or '&& !'. I'm doing this in the xml file

<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>

This applies the advice to all methods executed in com.disney.goofy and that are not annotated with NonDisneyCharacter

Declan
  • 246
  • 2
  • 3
6

This should work (spring AOP reference):

pointcut="execution(* x.y.z.ClassName.*(..))
          && !execution(* x.y.x.ClassName.someMethod(..))"
crunchdog
  • 13,078
  • 3
  • 23
  • 19
  • 2
    It doesn't work I'm afraid. Note that the Spring reference says && > AND and ! > Not in XML-files. Thanks for the tip anyway :) – Odinodin Feb 17 '10 at 08:40
2

I'm also using spring 2.5.6 and was having a similar problem with OR not working, but AND was working. It turns out that or (in lowercase) does work, so there is clearly a bug in that code.

It is interesting that the proper aspectJ syntax is &&, ||, and !, but the and/or/not syntax was added by spring to make working in xml easier. From the manual:

When combining pointcut sub-expressions, '&&' is awkward within an XML document, and so the keywords 'and', 'or' and 'not' can be used in place of '&&', '||' and '!' respectively.

I would guess that since && is the only one that is actually awkward in xml (there is nothing difficult about putting | or ! in xml) then AND is the only one that was properly tested

James Scriven
  • 7,784
  • 1
  • 32
  • 36