У меня есть сомнения в Spring AOP (aspectj)
Допустим, один из Advice сгенерировал непредвиденное / непроверенное исключение при выполнении некоторого фрагмента логики c (здесь After Advice с проблема)
@Aspect
public class DataBaseLoggingAspect {
@After("allGetters()")
public void printAfterAspect(JoinPoint joinPoint) throws Exception {
System.out.println("after logger storing in DB ");
Triangle t = (Triangle) joinPoint.getTarget();
t.getName();
// consider below logic is persisting data into DB and throw SQL Exception
throw new SQLException();
}
@Before("allGetters()")
public void printBeforeAspect(JoinPoint joinPoint) throws SQLException {
System.out.println("before logger storing in DB");
throw new SQLException();
}
@Pointcut("execution(public String room.aop.model.*.*())")
public void allGetters() {
}
}
Основной метод:
public class Main {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-context.xml");
ShapeService service = applicationContext.getBean("shapeService",ShapeService.class);
service.getTraingle().getName();
System.out.println("calling another method");
}
}
Из-за исключения в @After Advice ниже выдается ошибка, но я ожидаю продолжения бизнес-логики c, которая напечатайте "вызов другого метода" в консоли.
before logger storing in DB
after logger storing in DB
triangle shape
Exception in thread "main" java.lang.reflect.UndeclaredThrowableException
at room.aop.model.Triangle$$EnhancerBySpringCGLIB$$460db113.getName(<generated>)
at room.aop.client.Main.main(Main.java:16)
Caused by: java.sql.SQLException
at room.aop.aspects.DataBaseLoggingAspect.printAfterAspect(DataBaseLoggingAspect.java:22)
Мои мысли, чтобы решить вышеуказанную проблему, как показано ниже, но как это можно решить весной:
- Аспекты должны работать в другом потоке.
- Запустить Аспекты в огне и забыть (асинхронный)