为什么 BindingResult 必须遵循@Valid?

2022-09-04 07:12:11

当我遇到错误时,我正在努力使我的Spring MVC验证返回到页面提交的页面。我最终解决了这个问题,注意到BiningResult需要放在我正在验证的表单参数旁边。

例如,如果我将 spring.io 教程(http://spring.io/guides/gs/validating-form-input/)中的checkPersonInfo方法修改为 -

@RequestMapping(value="/", method=RequestMethod.POST)
public String checkPersonInfo(@Valid Person person, BindingResult bindingResult, Model model) {
    if (bindingResult.hasErrors()) {
        return "form";
    }
    return "redirect:/results";
}

然后它将工作并重定向到表单页面,但如果我将其更改为 -

@RequestMapping(value="/", method=RequestMethod.POST)
public String checkPersonInfo(@Valid Person person, Model model, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        return "form";
    }
    return "redirect:/results";
}

然后它重定向到 /errors

这是什么原因造成的?


答案 1

必须跟随绑定的对象。原因是,如果您有更多的对象被绑定,则必须知道哪个对象属于哪个对象。BindingResultBindingResult


答案 2

是的,今天我花了很长时间来检查为什么不能返回提交的页面,而是转到默认的可屏蔽错误页面。

调试后得到源代码

// org.springframework.web.method.annotation.ModelAttributeMethodProcessor#resolveArgument
if (binder.getBindingResult().hasErrors() && isBindExceptionRequired(binder, parameter)) {
    throw new BindException(binder.getBindingResult());
}

如果不跟随,则导致返回 true,然后直接抛出异常,因此无法在控制器方法中执行代码。BindingResult@ValidisBindExceptionRequired(binder, parameter)

// org.springframework.web.method.annotation.ModelAttributeMethodProcessor#isBindExceptionRequired 
protected boolean isBindExceptionRequired(WebDataBinder binder, MethodParameter methodParam) {
    int i = methodParam.getParameterIndex();
    Class<?>[] paramTypes = methodParam.getMethod().getParameterTypes();
    boolean hasBindingResult = (paramTypes.length > (i + 1) && Errors.class.isAssignableFrom(paramTypes[i + 1]));
    return !hasBindingResult;
}  

推荐