starter example baeldung advice java spring-aop

java - example - Spring AOP AfterThrowing vs. Around Advice



spring-aop maven (1)

al tratar de implementar un Aspecto, que es responsable de detectar y registrar un determinado tipo de error, inicialmente pensé que esto sería posible utilizando el consejo AfterThrowing. Sin embargo, parece que su consejo no detecta la excepción, sino que solo proporciona un punto de entrada adicional para hacer algo con la excepción.

El único consejo que también detectaría la excepción en cuestión sería un Asesoramiento en torno a los alrededores, ya sea eso o hice algo mal.

¿Alguien puede afirmar que, de hecho, si quiero detectar la excepción tengo que usar un AroundAdvice? La configuración que utilicé es la siguiente:

@Pointcut("execution(* test.simple.OtherService.print*(..))") public void printOperation() {} @AfterThrowing(pointcut="printOperation()", throwing="exception") public void logException(Throwable exception) { System.out.println(exception.getMessage()); } @Around("printOperation()") public void swallowException(ProceedingJoinPoint pjp) throws Throwable { try { pjp.proceed(); } catch (Throwable exception) { System.out.println(exception.getMessage()); } }

Tenga en cuenta que en este ejemplo capturé todas las Excepciones, porque solo es un ejemplo. Sé que es una mala práctica tragar todas las excepciones, pero para mi caso de uso actual quiero que solo se registre un tipo especial de excepción al tiempo que se evita la lógica de registro duplicado.


El documento de referencia de primavera dice:

"Después de lanzar el aviso, se ejecuta cuando sale una ejecución de método coincidente lanzando una excepción"

Para entonces es demasiado tarde para detectar la excepción, ya que ya se ha lanzado y el método ha salido. El enfoque que ha tomado con el consejo de @Around es la única forma de capturar realmente la excepción y tratarla antes de que salga el método.