【问题标题】:Spring MVC - Generic way of handling error and pass to viewSpring MVC - 处理错误并传递给视图的通用方法
【发布时间】:2016-12-04 10:30:28
【问题描述】:

从thymeleaf指南中,我看到了如下代码sn-p:

<ul th:if="${#fields.hasErrors('global')}">
<li th:each="err : ${#fields.errors('global')}" th:text="${err}">Input is incorrect</li>
</ul>

所以,我在想是否有一种方法可以从 Spring MVC 控制器传递错误消息并使用上面的代码在页面上的某处显示错误。

我看到一些在线资源在方法签名上使用了BindingResult,如下所示。

bindingResult.rejectValue("username", "username.notvalid", "Username is not valid");

但是如果控制器不验证任何对象怎么办?我还能使用 bindingResult 吗?

我想我也可以将错误消息作为密钥对添加到模型中,如下所示。

model.addAttributes("error","error message");

但是,我想知道 Spring 控制器中是否有一些标准的错误处理方式。

我应该改用异常处理吗?但是如何将错误消息传递回视图?

谢谢

更新用例:

例如,在方法 A 中,检测到错误如下。

public String methodA (Model m, RedirectAttributes model){
 if (error == true){
   model.addFlashAttribute("error.message","String");
   return "redirect:MethodB";
 }
}


public String methodB(Model m){
 if(m.containsAttribute("error.message"){
   //Way to pass the error to view page for display.
 }
}

应该这样处理错误吗?之所以会进行第二个动作,是因为最终的视图页面需要展示一些数据。

【问题讨论】:

    标签: java spring-mvc error-handling


    【解决方案1】:

    验证错误不要使用异常,使用BindingResult,看看this questionjavadoc

    您还可以创建类似MapBindingResult 的实现,使用它并将其设置在视图的请求/模型中。

    BindingResult 是一种标准的 Spring 数据结构,可用于保存错误,通常在可能存在多个错误或您有查看代码的情况下使用;如果你只有一个错误,你也可以在模型中设置它。

    由于您使用了 flash 属性,因此在 methodB 中,模型中已经存在错误,因此可以在视图中使用它。另见Spring MVC: Passing a Model as an argument to a controller method VS instantiating it explicitly

    public String methodB(Model m){
         ...
         return "myview";
    }
    

    请注意,如果您在属性键中使用点(例如 error.message),您应该在视图中使用正确的语法,例如,对于 JSP:model["error.message"] 而不是 model.error.message

    【讨论】:

    • 如果控制器不需要验证,但它是检查是否有来自先前重定向控制器的任何闪存属性(字符串)?如果传入的 flash 属性不为 null,那么控制器应该包含到 bindingResult 对象中并将其作为错误消息显示在视图上?
    • 如果有验证错误我认为你不应该重定向,而只是显示视图stackoverflow.com/a/599105/1536382
    • 它不是用于验证错误,而是从一个控制器传递到另一个控制器并最终显示在页面上的错误消息。
    • 请检查上面更新的问题,了解我的用例。
    猜你喜欢
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 2012-02-14
    • 2013-11-27
    • 1970-01-01
    相关资源
    最近更新 更多