问题:
- 使用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内置函数要覆盖。
对这个问题有什么好的解决办法/建议吗?
1条答案
按热度按时间mec1mxoz1#
您不能神奇地违反JVM关于抛出未声明的检查异常的限制。
对不起,我不能为您更改JVM。您需要遵守它的规则。