【发布时间】:2011-10-11 13:55:12
【问题描述】:
情况
我正在尝试对记录异常的代码进行分组,并以几种方法呈现漂亮的视图。目前,逻辑有时在@RequestHandler 本身(在 catch 块中),有时被委托给实用程序类(该类有效但将逻辑从异常发生的地方移开抛出)。
Spring 的@ExceptionHandler 似乎是将所有内容(控制器本身或父级)分组到一个位置并摆脱一些代码的方式(无需将逻辑放入 try-catch 并且没有需要一个实用程序类)...直到我意识到@ExceptionHandler 方法不会自动连接ModelMap 或BindingResult 参数。目前,这些对象用于呈现带有合理错误消息的视图,我们也希望记录这些对象中包含的一些信息。
问题
为什么 Spring 不支持 ModelMap 或 BindingResult 等 @ExceptionHandler 的方法参数?其背后的原理是什么?
可能的解决方案
在 Spring 源代码 (3.0.5) 中,该方法的参数在 HandlerMethodInvoker.invokeHandlerMethod 中解析。请求处理程序抛出的异常被捕获并重新抛出。 @ExceptionHandler 及其参数在别处解析。作为一种解决方法,我想检查异常是否实现了假设的“ModelAware”或“BindingResultAware”接口,在这种情况下,在重新抛出它之前设置 Model 和 BindingResult 属性。
听起来怎么样?
【问题讨论】:
标签: spring-mvc exception-handling