Por que BindingResult tem que seguir @Valid?

Eu estava lutando para que minha validação do Spring MVC retornasse à página enviada quando havia erros. Finalmente resolvi o problema percebendo que BindingResult precisa estar ao lado do parâmetro que estou validando.

Por exemplo, se eu alterar o método checkPersonInfo no tutorial spring.io (http://spring.io/guides/gs/validating-form-input/) para -

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

Em seguida, ele funcionará e será redirecionado para a página do formulário, mas se eu a alterar para -

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

Em seguida, ele redireciona para / errors

Qual é a causa disso?

questionAnswers(3)

yourAnswerToTheQuestion