Как игнорировать исключения AOP и продолжать работу с сервисной логикой - PullRequest
0 голосов
/ 23 марта 2020

У меня есть сомнения в 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) 

Мои мысли, чтобы решить вышеуказанную проблему, как показано ниже, но как это можно решить весной:

  1. Аспекты должны работать в другом потоке.
  2. Запустить Аспекты в огне и забыть (асинхронный)
...