Saltar al contenido

Manejo de excepciones a través de Spring AOP + Aspectj

Poseemos la mejor respuesta que encontramos en internet. Nosotros esperamos que te sirva de ayuda y si deseas comentarnos algo que nos pueda ayudar a mejorar puedes hacerlo..

Solución:

Consulte la sección de consejos Después de lanzar de https://docs.spring.io/spring/docs/4.1.0.RELEASE/spring-framework-reference/htmlsingle/#aop-introduction-defn

Después de lanzar un consejo, se ejecuta cuando la ejecución de un método coincidente finaliza lanzando una excepción. Se declara usando la anotación @AfterThrowing:

Ejemplos

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.AfterThrowing;

@Aspect
public class AfterThrowingExample 

   @AfterThrowing("com.xyz.myapp.SystemArchitecture.dataAccessOperation()")
   public void doRecoveryActions() 
     // ...
    





import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.AfterThrowing;

@Aspect
public class AfterThrowingExample 

    @AfterThrowing(
    pointcut="com.xyz.myapp.SystemArchitecture.dataAccessOperation()",
    throwing="ex")
    public void doRecoveryActions(DataAccessException ex) 
       // ...
     


Me encontré con el mismo escenario en el que tenía que devolver una respuesta de error DTO en caso de que se manejara una excepción. Dentro de la clase @Aspect,

@Aspect
@Component
public class MyAspect

Definió otra clase para el manejo de excepciones como a continuación:

@ControllerAdvice
public class ExceptionLogAdvice 

    @ExceptionHandler(InternalServerException.class)
    @ResponseStatus(HttpStatus.BAD_GATEWAY)
    @ResponseBody
    public ResponseEntity handleValidationException(final InternalServerException internalServerException)

        ErrorResponseDTO dto = constructErrorResponse(internalServerException);
        return ResponseEntity.status(HttpStatus.BAD_GATEWAY).body(dto);
    


Ajusté un poco el código porque no puedo compartir el código real. Espero haber dejado claro el concepto.

Teniendo en cuenta que com.sc.bs.impl.* es un paquete de capa de negocio/dominio y lo interceptó en la capa AOP usando la anotación @Around. Fragmento de código:

@Around("execution(* com.sc.bs.impl..*.*(..))")
public Object exceptionHandlerWithReturnType(ProceedingJoinPoint joinPoint) throws Throwable
    try 
        obj = joinPoint.proceed();
     catch(Exception ex) 
        throw ex;
    

Aquí puedes ver las reseñas y valoraciones de los usuarios

Recuerda algo, que te brindamos la opción de parafrasear tu experiencia si encontraste tu traba a tiempo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Respuestas a preguntas comunes sobre programacion y tecnología