2010-02-15 13 views
18

Tengo problemas con una definición de punto de corte en Spring (versión 2.5.6). Estoy tratando de interceptar todas las llamadas a un método a una clase, a excepción de un método dado (algunosMétodo en el ejemplo a continuación).Spring AOP Pointcut sintaxis para AND, OR y NOT

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

Sin embargo, el interceptor también se invoca para algunosMétodo.

Luego probé esto:

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

Pero esto no compila ya que no es una sintaxis válida (me da un BeanCreationException).

¿Alguien puede dar algún consejo?

+0

¿Ha considerado escribir la lógica de aspecto con el estilo @AspectJ en su lugar? Es mucho más simple y más potente escribir la lógica de aspecto con Java. Especialmente si está usando Eclipse con el plugin AJDT. – Espen

Respuesta

18

sé que es probablemente un poco tarde en esta etapa, pero ive estado teniendo el mismo problema y lo resolví al escapar los caracteres ampersand por lo que su &amp;&amp; ! en lugar de ' Y NO 'o' & &! '. que estoy haciendo esto en el archivo 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> 

Esto se aplica el asesoramiento a todos los métodos ejecutados en com.disney.goofy y que no están anotados con NonDisneyCharacter

4

Esto debería funcionar (spring AOP reference):

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

No funciona, me temo.Tenga en cuenta que la referencia de Spring dice &&> AND y! > No en archivos XML. Gracias por el consejo de todos modos :) – Odinodin

1

También estoy usando la primavera 2,5. 6 y estaba teniendo un problema similar con O no funcionaba, pero Yera trabajando. Resulta que o (en minúscula) funciona, por lo que claramente hay un error en ese código.

Es interesante que la sintaxis correcta aspectj es & &, || y !, pero la sintaxis y/o/no se agregó por la primavera para facilitar el trabajo en xml. Del manual:

Al combinar pointcut sub-expresiones, '& &' es incómoda dentro de un documento XML, por lo que las palabras clave 'y', 'o' y 'no' puede ser utilizado en lugar de '& &', '||' y '!' respectivamente.

Me imagino que desde & & es el único que es realidad torpe en XML (no hay nada difícil de poner |! O en XML) a continuación Y es el único que estaba correctamente probado

Cuestiones relacionadas