<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class ExceptionHandlerAspect {
@Around("@annotation(exceptionHandler)")
public Object handleExceptions(ProceedingJoinPoint joinPoint, ExceptionHandler exceptionHandler) {
try {
return joinPoint.proceed();
} catch (Throwable e) {
for (Class<? extends Exception> exceptionClass : exceptionHandler.exceptions()) {
if (exceptionClass.isAssignableFrom(e.getClass())) {
throw new DataTransferException(exceptionHandler.message(), e);
}
}
throw new RuntimeException(e);
}
}
}
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExceptionHandler {
String message() default "An error occurred";
Class<? extends Exception>[] exceptions() default Exception.class;
}
@ExceptionHandler(message = "Failed to delete data from destination table", exceptions = {SQLException.class})
private void deleteDataFromDestinationTable() {
String destinationTable = properties.getDestinationTable();
jdbcTemplate.update("DELETE FROM " + destinationTable);
}