当前位置: 首页 > 知识库问答 >
问题:

Spring和AOP-处理每个抛出的异常

莘俊能
2023-03-14

我需要拦截每个抛出的异常并对其进行处理。我正在使用这部分代码:

@Aspect
@Component
class Advice
{
    @AfterThrowing(pointcut = "execution(* mail.service..*.*(..))", throwing = "throwable")
    public void sendError(Throwable throwable)
    {
    System.out.println("exception thrown");
    }
}

这个切入点似乎只影响公共方法(我想这是Spring AOP预期的?),但它只在某些方法中打印字符串,例如,在我的Spring配置类中声明的方法(我猜是因为它们在应用程序启动之前被初始化),而不是在其他方法中。

我试图让这方面为任何抛出的异常工作,但没有成功。这与我使用Spring AOP而不是完整的AspectJ有什么关系吗?

此外,我的项目是用Kotlin编写的(我用Java编写了aspect,因此IJ可以支持它),这会对使用AspectJ产生影响吗?为了让它工作,我遇到了很多麻烦(因为最后一个类),我想知道当我开始编写更高级的AspectJ代码时,它是否会变得更难。

谢谢

共有1个答案

施默
2023-03-14

是的,Spring AOP仅适用于Spring组件和公共方法(加上CGLIB代理的受保护和包保护方法)。它也不适用于自调用方法,如this.do某物(),因为这些方法不通过代理。只有当您的异常在通过代理调用的方法之外升级时,Spring AOP才能拦截它。

带有LTW(加载时编织)或CTW(编译时编织)的AspectJ没有任何这些限制,此外,您还可以在构造函数中处理异常,而不仅仅是在方法中。

以前从未使用过Kotlin,我无法告诉您可能存在哪些问题,但最终类本身不应该是问题,因为AspectJ直接插入类的字节码,而不是通过代理。试试看。

顺便说一句,如果你仅仅因为AOP而使用Spring:你根本不需要使用Spring来将AOP应用到你的类中,因为AspectJ完全独立于Spring。你可以选择是否同时使用它们。例如,我从不使用Spring,只使用Java SE AspectJ。

 类似资料:
  • 但是,我想改变它,这样从域层抛出的异常将在AOP层中处理。AOP层会产生某种错误响应,并将其发送回spring控制器/web服务层。 我可以创建一个IBizResponse并创建它的两个子类/接口,可能是SuccessResponse和ErrorResponse,并使域层方法返回IBizResponse。但是,我不知道如何使AOP将ErrorResponse对象返回到服务层。

  • 通过抛出异常,我可以防止对API的访问,但它不会返回我试图抛出异常的有意义的消息。 有人使用这样的用例并能帮助我吗?

  • 我有下面的代码块。我得到的是的catch块没有处理它。有人能告诉我如何处理下面的块抛出的异常吗?

  • 问题内容: 在我的项目中,我有一个域层(基本上是POJO)和一个位于域层顶部的Spring控制器/服务层。我还有一个位于服务和域之间的AOP层。 我的域层正在引发业务异常,这些异常现在正在服务层中进行处理。 但是我想更改它,以便从域层引发的异常将在AOP层中处理。AOP层将发生某种错误响应,并将其发送回spring控制器/ Web服务层。 我可以创建一个IBizResponse并为其创建两个子类/

  • 我正在使用Spring4和Tomcat。问题是有时我不得不在我的筛选器中抛出一个(自定义的)RuntimeException(控件甚至还没有到达控制器)。问题是,由于我没有抛出tomcat理解的异常,它被转换为500(内部服务器错误)。我相信403禁止会比500好(对于我的定制例外)。我查看了和注释。但只有当控件到达控制器时,这些才起作用。 到目前为止,我在筛选器的中将状态手动设置为403。有没有

  • 虽然已经在响应拦截器里做了一些全局处理,最后是通过 Promise.reject 抛出的异常 现在每个接口请求方法都还是得写 try/catch 或者 .catch() 真的好麻烦 有什么比较好的方案吗?