O que o setId() está fazendo nesse método do Controller?

Opa pessoal.

Apesar de buscar e quebrar a cabeça bastante, não consegui entender um trecho do código abaixo para dar o update em um recurso usando o Bean Validation:

@GetMapping("/edit/{id}")
public String showUpdateForm(@PathVariable("id") long id, Model model) {
    User user = userRepository.findById(id)
      .orElseThrow(() -> new IllegalArgumentException("Invalid user Id:" + id));
    
    model.addAttribute("user", user);
    return "update-user";
}


@PostMapping("/update/{id}")
   public String updateUser(@PathVariable("id") long id, @Valid User user, 
   BindingResult result, Model model) {
if (result.hasErrors()) {
    user.setId(id);
    return "update-user";
}
    
userRepository.save(user);
model.addAttribute("users", userRepository.findAll());
return "redirect:/index";
}

update-user.html:

<form action="#" 
  th:action="@{/update/{id}(id=${user.id})}" 
  th:object="${user}" 
  method="post">
    <label for="name">Name</label>
    <input type="text" th:field="*{name}" id="name" placeholder="Name">
    <span th:if="${#fields.hasErrors('name')}" th:errors="*{name}"></span>
    <label for="email">Email</label>
    <input type="text" th:field="*{email}" id="email" placeholder="Email">
    <span th:if="${#fields.hasErrors('email')}" th:errors="*{email}"></span>
    <input type="submit" value="Update User">   
</form>

Eu não entendi essa parte:

if (result.hasErrors()) {
    user.setId(id);
    return "update-user";
}

Se o BindingResult conter qualquer tipo de erro ele cai nessa parte. O que estão fazendo antes de retornar para a página update-user novamente? Qual o sentido de dar o setId() se não está sendo usado em lugar algum? Fiz o teste retirando esse setId e continua a mesma coisa.
Em vários tutoriais de CRUD em Spring Boot usam dessa forma. Exemplo:


Link para download do projeto:

Obrigado.

O ID do usuário a ser atualizado vem como uma variável de path (/{id} que aparece na rota), por este motivo é aplicado o setId, acredito que seja para garantir que em caso de falha de validação ao retornar o usuário para o formulário ele contenha o mesmo ID enviado anteriormente.

O if aplicado verifica se algum dos atributos da classe User contém erros de validação, caso contenha faz o processo que descrevi acima, caso contrário segue o fluxo normal e salva os dados na base e redireciona para a rota /index.

1 curtida