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.