bindingresult/错误没有在模型属性之后立即声明,但是没有问题,为什么?

w6mmgewl  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(393)

我正在阅读团队中的一些遗留代码,发现有些处理程序方法没有 BindingResult / Errors 在model属性之后声明,但是代码运行良好,没有任何问题。这与我之前对springmvc的理解有冲突。
例如,一个处理程序方法如下所示

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

有人能告诉我为什么在这种情况下没有出现错误“errors/bindingresult参数应该在model属性之后立即声明”?

ltqd579y

ltqd579y1#

spring的文档说明:错误或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参数,声明时没有前面的model属性。检查处理程序方法签名。
解决方案:

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

每当您想在控制器方法中定义bindingresult对象时,就在(@modeldAttribute)model属性之后声明它。

相关问题