gpt4 book ai didi

spring-mvc - 为什么 Spring MVC 不允许将 Model 或 BindingResult 暴露给 @ExceptionHandler?

转载 作者:行者123 更新时间:2023-12-03 09:30:34 25 4
gpt4 key购买 nike

情况

我正在尝试对记录异常的代码进行分组,并以几种方法呈现漂亮的 View 。目前逻辑在 @RequestHandler 中的某个时候。本身(在一个 catch block 中),有时被委托(delegate)给一个实用程序类(它可以工作但将逻辑从引发异常的地方移开)。

Spring 的@ExceptionHandler似乎是将所有内容集中在一个地方( Controller 本身或父级)并摆脱一些代码(无需将逻辑放入 try-catch 并且不需要实用程序类)的方式......直到我意识到@ExceptionHandler方法不会有 ModelMapBindingResult参数自动接线。目前,这些对象用于呈现带有合理错误消息的 View ,我们也希望记录这些对象中包含的一些信息。

问题

为什么 Spring 不支持方法参数,例如 ModelMapBindingResult对于@ExceptionHandler ?其背后的原理是什么?

可能的解决方案

在 Spring 源代码 (3.0.5) 中,方法的参数在 HandlerMethodInvoker.invokeHandlerMethod 中解析。 .请求处理程序抛出的异常被捕获并重新抛出。 @ExceptionHandler它的参数在别处解析。作为一种解决方法,我想检查异常是否实现了假设的“ModelAware”或“BindingResultAware”接口(interface),在这种情况下,在重新抛出它之前设置 Model 和 BindingResult 属性。
听起来怎么样?

最佳答案

不久前我遇到了同样的问题。 ModelMapBindingResult@ExceptionHandler 的 JavaDocs 中明确未列为支持的参数类型,所以这一定是故意的。

我认为它背后的原因是一般抛出异常可能会让你的 ModelMap处于不一致的状态。所以根据你的情况你可以考虑

  • 显式捕获异常以告诉 Spring MVC 您知道自己在做什么(您可以使用模板模式将异常处理逻辑重构到一个地方)
  • 如果您可以控制异常层次结构,则可以移交 BindingResult到异常并稍后从异常中提取它以用于渲染
  • 首先不要抛出异常,而是使用一些结果代码(就像 BeanValidation 一样)

  • 高温高压

    关于spring-mvc - 为什么 Spring MVC 不允许将 Model 或 BindingResult 暴露给 @ExceptionHandler?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6799393/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com