CoreExceptionsManagementAspect.java
package net.andresbustamante.yafoot.core.aop;
import net.andresbustamante.yafoot.commons.exceptions.DatabaseException;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Component;
import java.net.ConnectException;
import java.sql.SQLException;
import java.text.MessageFormat;
@Aspect
@Component
public class CoreExceptionsManagementAspect {
/**
* Pointcut for core service methods.
*/
@Pointcut("execution(* net.andresbustamante.yafoot.core.services.impl.*ServiceImpl.*(..))")
public void filterServicesMethods() {
// no-op
}
/**
* Transform database related exceptions into {@link DatabaseException}.
*
* @param pjp Join point for a core method
* @return Method return
* @throws Throwable Method exception thrown
*/
@Around("filterServicesMethods()")
public Object transformException(final ProceedingJoinPoint pjp) throws Throwable {
Object returnedObject;
try {
returnedObject = pjp.proceed();
} catch (DataAccessException | ConnectException | SQLException e) {
// Database exceptions
String message = MessageFormat.format("Database error when processing the request for {0}",
pjp.getSignature().toShortString());
throw new DatabaseException(message + System.lineSeparator() + e.getMessage());
}
return returnedObject;
}
}