spring-data-jpa 使用Sping Boot AOP控制器建议时出现未声明的Throwable异常,其中连接点与jpa存储库函数匹配

sd2nnvve  于 2022-11-10  发布在  Spring
关注(0)|答案(1)|浏览(89)

问题:

  • 使用MVCS架构的Sping Boot 服务。我正在为仓库目录中任何类中存在的所有函数使用Spring AOP建议(around advice)。因此,例如,当调用jpa保存方法时,around建议被触发。
  • 下面是在没有异常发生的情况下调用的方法。
  • CONTROLLER-〉SERVICE LAYER-〉call to repository layer function triggers advice function which allows join point to proceed-〉REPOSITORY LAYER-〉around advice-〉,并且一切执行正常。
  • 下面是控制器通知函数抛出异常时的流程。
  • 这是因为,在1998年,在1999年,在1999年,在1999年,在1999年,在1999年,在1999年,在1999年,在1999年,在1999年,在1999年,在1999年,在1999年,在1999年,在1999年,在1999年,在1999年,在1999年,在1999年,在1999年,在1999年,在1999年,在1999年,在1999年,在1999年,在1999年,在1999年,在1999年
  • 问题是服务层不知道控制器建议(它的行为就像一个代理),并认为存储库层不会抛出任何异常,因为它没有在其方法签名(例如默认的保存方法)中声明throws
  • 所以到达控制器的异常不是由控制器通知函数抛出的异常,实际上Java将该异常 Package 在UndeclareedThrowableException中。
  • 处理这种情况的一种方法是检查ex.getCause(),并获取Java Package 在UndeclareedThrowableException中的异常。
  • 另一种方法是在存储库方法签名中声明throws,这样服务层就可以知道抛出异常的存储库函数。(但这对于jpa提供的默认实现是不可能的--比如保存函数--至少在不覆盖save函数的情况下是不可能的),我不想这样做,因为有很多jpa内置函数要覆盖。

对这个问题有什么好的解决办法/建议吗?

mec1mxoz

mec1mxoz1#

您不能神奇地违反JVM关于抛出未声明的检查异常的限制。

  • 抛出一个已检查的异常,该异常实际上已在被拦截的目标方法中声明,或者
  • 抛出一个运行时异常,可以选择将其 Package 在要抛出的已选中异常周围。

对不起,我不能为您更改JVM。您需要遵守它的规则。

相关问题