Я пытался отобразить ошибки проверки, используя этот подход , но он не работает. Вот моя форма регистрации пользователя:
<form action="#" th:action="@{/register}" th:object="${newUser}" method="post">
<input type="text" th:field="*{username}">
<input type="password" th:field="*{password}">
<input type="submit" value="Register">
</form>
Если я использую name = "username" и name = "password" вместо th: поле, то оно отлично связывает объект.
Вотмой контроллер:
@PostMapping("/register")
public String handlePostRequest (@Valid @ModelAttribute("newUser") UserModel newUser, BindingResult bindingResult, Model model) {
if(bindingResult.hasErrors()){
System.out.println(bindingResult.getFieldErrorCount());
for (FieldError err:bindingResult.getFieldErrors()){
System.out.println(err.getDefaultMessage());
}
}else{
newUser.setRoles("USER");
userRepository.addUser(newUser);
return "redirect/:login";
}
return "register";
}
Я обошел его, передав сообщение об ошибке в качестве атрибута модели вместо использования # fields.hasErrors
@Controller
public class RegisterController {
private IUserRepository userRepository;
@Autowired
public RegisterController(IUserRepository userRepository) {
this.userRepository = userRepository;
}
@GetMapping({"/register"})
public String handleGetRequest (Model model) {
model.addAttribute("errorHappened",false);
return "register";
}
@PostMapping("/register")
public String handlePostRequest (@Valid @ModelAttribute("newUser") UserModel newUser, BindingResult bindingResult, Model model) {
if(bindingResult.hasErrors()){
model.addAttribute("errorHappened",true);
model.addAttribute("errorMsg", bindingResult.getFieldError().getDefaultMessage());
}else{
model.addAttribute("errorHappened",false);
newUser.setRoles("USER");
if(userRepository.addUser(newUser))
return "redirect:/login";
else{
model.addAttribute("errorHappened",true);
String usernameTaken = "Username is already taken";
model.addAttribute("errorMsg", usernameTaken);
return "register";
}
}
return "register";
}
}
, а затем я отображаю ошибку, как это
<span class="alert alert-danger" role="alert" th:if="${errorHappened}" th:text="${errorMsg}" style="font-weight: bold"></span>