Как правильно осуществить валидацию юзера перед его сохранением? В моем случае контроллер игнорирует наличие ошибок и пытается сохранить юзера, не прошедшего валидацию и все падает на попытке закодировать пароль (которого, разумеется, нет, поскольку пользователь валидацию не прошел). Что я не сделал?
Контроллеры:
@GetMapping("new")
public ModelAndView saveNewUserAccount() {
ModelAndView modelAndView = new ModelAndView();
UserAccount userAccount = new UserAccount();
modelAndView.addObject("user_account", userAccount);
modelAndView.setViewName("new");
return modelAndView;
}
@PostMapping("new")
public ModelAndView saveNewUserAccount(@Valid @ModelAttribute(value="user_account") UserAccount user, BindingResult result) {
ModelAndView modelAndView = new ModelAndView();
if (result.hasErrors()) {
modelAndView.setViewName("new");
} else {
userService.saveUser(user.getUsername(), user.getPassword(), user.getFirstname(), user.getLastname());
modelAndView.addObject("successMessage", "User has been added successfully");
modelAndView.setViewName("new");
}
return modelAndView;
}
HTML
<body>
<form action="http://localhost:8080/logout" method="POST">
<input type="submit" value="Выйти">
</form>
<form action="new" th:object="${user_account}" method="post">
<div>
<input name="username" type="text" placeholder="Username"/>
<p th:if="${#fields.hasErrors('username')}" th:errors="*{username}"></p>
<input name="password" type="password" placeholder="Password"/>
<p th:if="${#fields.hasErrors('password')}" th:errors="*{password}"></p>
<input name="firstname" type="text" placeholder="First name"/>
<p th:if="${#fields.hasErrors('firstname')}" th:errors="*{firstname}"></p>
<input name="lastname" type="text" placeholder="Last name"/>
<p th:if="${#fields.hasErrors('lastname')}" th:errors="*{lastname}"></p>
<input type="submit" value="Save User"/>
</div>
<span class="text-success" th:utext="${successMessage}"></span>
</form>
</body>
А вот сущность.
@Entity
@Table(name = "user_account")
public class UserAccount implements UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(unique = true)
@Size(min = 3, max = 16, message = "Username length must be 3-16 symbols")
@Pattern(regexp = "[a-zA-Z]", message = "Username must contain latin letters only")
private String username;
@Size(min = 3, max = 16, message = "Password length must be 3-16 symbols")
@Pattern(regexp = "^[a-zA-Z0-9]+$", message = "Password must contain latin letters and numbers only")
private String password;
@Size(min = 1, max = 16, message = "Firstname length must be 1-16 symbols")
@Pattern(regexp = "[a-zA-Z]", message = "Password must contain at least one letter")
private String firstname;
@Size(min = 1, max = 16, message = "Lastname length must be 1-16 symbols")
@Pattern(regexp = "[a-zA-Z]", message = "Password must contain at least one digit")
private String lastname;
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Set<Role> roles;
private boolean status;
private LocalDate createDate;