Spring 如何忽略AOP异常并继续使用服务逻辑
我对SpringAOP(aspectj)有疑问 假设一个通知在执行某个逻辑时抛出了意外/未检查的异常(这里是在通知出现问题之后) 主要方法:Spring 如何忽略AOP异常并继续使用服务逻辑,spring,aspectj,spring-aop,Spring,Aspectj,Spring Aop,我对SpringAOP(aspectj)有疑问 假设一个通知在执行某个逻辑时抛出了意外/未检查的异常(这里是在通知出现问题之后) 主要方法: public class Main { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-context.xml");
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通知中出现异常,下面抛出了错误,但我希望继续执行业务逻辑,即在控制台中打印“调用另一个方法”
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)
在记录器存储到数据库之前
记录器存储在数据库中后
三角形
线程“main”java.lang.reflect.UndeclaredThrowableException中的异常
在room.aop.model.Triangle$$EnhancerBySpringCGLIB$$460db113.getName()中
at room.aop.client.Main.Main(Main.java:16)
原因:java.sql.SQLException
在room.aop.aspects.DataBaseLoggingAspect.printAfterAspect(DataBaseLoggingAspect.java:22)
我对解决上述问题的想法如下,但如何在春季处理这一问题:
在AspectJ中,您可以编写一个方面来拦截另一个方面,而在SpringAOP中则不能。但我也认为这会被过度设计。我的建议是保持简单,并向您的方面添加适当的异常处理。不建议使用@kriegaex处理未检查的异常。我认为合适的方法是异步处理JMS/中的持久性逻辑。稍后我将实现并共享代码。伙计,你问这个问题是因为你想处理异常。所以,只要处理好它们,不要变得哲学化。“不建议处理未检查的异常”,这是从哪里得到的?未检查并不意味着未处理。您明确希望应用程序代码继续运行。这不可避免地意味着您需要以某种方式处理异常。
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)