@Don_Conteo

Как вывести ошибки на UI в spring при помощи th?

Как правильно осуществить валидацию юзера перед его сохранением? В моем случае контроллер игнорирует наличие ошибок и пытается сохранить юзера, не прошедшего валидацию и все падает на попытке закодировать пароль (которого, разумеется, нет, поскольку пользователь валидацию не прошел). Что я не сделал?

Контроллеры:
@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;
  • Вопрос задан
  • 87 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы