web-dev-qa-db-fra.com

Syntaxe Spring AOP Pointcut pour AND, OR et pas

J'ai des problèmes avec une définition de pointcut dans Spring (version 2.5.6). J'essaie d'intercepter tous les appels de méthode à une classe, à l'exception d'une méthode donnée (someMethod dans l'exemple ci-dessous).

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

Cependant, l'intercepteur est également appelé pour une méthode.

Puis j'ai essayé ceci: 

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

Mais cela ne compile pas car ce n'est pas une syntaxe valide (j'obtiens une BeanCreationException).

Quelqu'un peut-il donner des conseils?

18
Odinodin

je sais que c'est probablement un peu tard à ce stade, mais ive a eu le même problème et je l'ai résolu en échappant les caractères esperluette afin que son &amp;&amp; ! au lieu de 'AND NOT' ou '&&!'. Je le fais ceci dans le fichier 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>

Ceci s'applique à toutes les méthodes exécutées dans com.disney.goofy et qui ne sont pas annotées avec NonDisneyCharacter.

21
Declan

Cela devrait fonctionner ( référence AOP de printemps ):

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

J'utilise également spring 2.5.6 et je rencontrais un problème similaire avecOUqui ne fonctionnait pas, maisET fonctionnait . Il s'avère que ou (en minuscule) ne fonctionne pas , donc il y a clairement un bug dans ce code. 

Il est intéressant de noter que la syntaxe correcte pour aspectJ est && , || , et ! , mais la syntaxe et/ou/not a été ajoutée au printemps pour faciliter le travail en xml. Du manuel:

Lorsque vous combinez des sous-expressions De type pointcut, '&&' est maladroit Dans un document XML. Les mots-clés 'Et', 'ou' et 'non' peuvent être utilisé à la place de '&&', '||' et '!' respectivement.

J'imagine que puisque && est le seul qui soit en fait / maladroit en xml (il n'y a rien de difficile à mettre | ou! En xml) alorsETest le seul celui qui a été correctement testé

1
James Scriven