2011-12-01 10 views
7

Estoy intentando configurar la primavera para que ejecute consejo cuando una subclase excepción específica (MyTestException) es lanzada:AOP primavera y Excepción Interceptar

public class MyTestExceptionInterceptor implements ThrowsAdvice { 
    public void afterThrowing(Method method, Object[] args, Object target, Exception exc) { 
     // I want this to get executed every time a MyTestException is thrown, 
     // regardless of the package/class/method that is throwing it. 
    } 
} 

Y la configuración XML:

<bean name="interceptor" class="org.me.myproject.MyTestExceptionInterceptor"/> 

<aop:config> 
    <aop:advisor advice-ref="interceptor" pointcut="execution(???)"/> 
</aop:config> 

Tengo la sensación de que debería estar usando el especificador de corte puntual target (en lugar de execution) ya que, según el Spring docs, parece que target me permite especificar el tipo de excepción para que coincida con t, pero no estoy seguro de si eso está mal, o de cómo debe ser mi atributo pointcut.

me habría enormemente prefieren mantener la configuración AOP hecho en XML (a diferencia de Java/anotaciones, pero probablemente se podría traducir una solución basada en la anotación en XML si es necesario.

Respuesta

8

que haría uso un <aop:after-throwing> element y su atributo throwing.

primavera config

<bean name="tc" class="foo.bar.ThrowingClass"/> 

<bean name="logex" class="foo.bar.LogException"/> 

<aop:config> 
    <aop:aspect id="afterThrowingExample" ref="logex"> 
    <aop:after-throwing method="logIt" throwing="ex" 
         pointcut="execution(* foo.bar.*.foo(..))"/> 
    </aop:aspect> 
</aop:config> 

El throwing atributo es el nombre del parámetro del método de control del aspecto (en este caso es LogException.logIt) que es llamada en la excepción:

Aspecto

public class LogException { 
    public void logIt(AnException ex) { 
     System.out.println("*** " + ex.getMessage()); 
    } 
} 

El XML y el método combinado define el tipo de excepción que se aplica el aspecto a. En este ejemplo, ThrowingClass arroja AnException y AnotherException. Solo AnException tendrá el consejo aplicado debido a la firma del método del consejo.

See example project on github for full source.

1

Echa un vistazo al AfterThingingAdvice. Se encuentra un ejemplo en here (busque "Después de lanzar el consejo") y lo encontrará.

Cuestiones relacionadas