【问题标题】:BindingResult/Errors not declared immediately after the model atrribute, but no problem, why?BindingResult/Errors 没有在模型属性之后立即声明,但是没有问题,为什么?
【发布时间】:2021-04-09 17:13:31
【问题描述】:

我正在阅读我团队中的一些遗留代码,我发现一些处理程序方法没有在模型属性之后立即声明 BindingResult/Errors,但代码运行良好,没有任何问题。这和我之前对springMVC这个话题的理解有冲突。

例如,一个处理程序方法如下所示

@RequestMapping(value = "/search")
public String initateSearchData(HttpServletResponse response, HttpSession session, @ModelAttribute("searchData") SearchData searchData, Model model, Errors errors).

谁能告诉我为什么在这种情况下没有显示错误“An Errors/BindingResult argument is expected to be declared after the model attribute”?

【问题讨论】:

  • 我怀疑那是一个处理程序方法,而是从另一个处理程序方法调用的方法和传入的参数。因此,从通过RequestMappingHandlerAdapter 调用的意义上讲,不是一个处理程序遇到。 .
  • 您好,Deinum,感谢您的回复。这个方法上面有 @RequestMapping(value = "/xxx") 。我认为这是一种处理方法。我刚刚更新了帖子。

标签: spring spring-boot validation spring-mvc data-binding


【解决方案1】:

Spring 的文档说:Errors 或 BindingResult 参数必须遵循立即绑定的模型对象,因为方法签名可能具有多个模型对象,并且 Spring 将为每个模型对象创建一个单独的 BindingResult 实例。 下面的代码解释了场景

问题:

@Controller
public class UserController {

    @RequestMapping(value = "addUser")
    public String addUser(@ModelAttribute("userForm") UserForm userForm,
        ModelMap map, BindingResult results) {

        if (results.hasErrors()) {
            return "add_user_form";
        }

        return "add_user_success";
    }
    //...
}

上面的代码给出了 java.lang.IllegalStateException: Errors/BindingResult 参数声明没有前面的模型属性。检查您的处理程序方法签名。

解决方案:

@RequestMapping(value = "addUser")
public String addUser(@ModelAttribute("userForm") UserForm userForm,
    BindingResult results, ModelMap map)

当您想在控制器方法中定义 BindingResult 对象时,请在 (@ModelAttribute) 模型属性之后声明它。

【讨论】:

    猜你喜欢
    • 2018-06-26
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 2016-06-26
    • 2014-08-06
    • 1970-01-01
    相关资源
    最近更新 更多