@RomulFobos

Почему-то BindingResult не ловит ошибку, как исправить?

Пробую написать проект с использованием Spring.
Есть класс User, объекты которого являются зарегистрированными пользователями сайта. Необходимые поля класса User пометил аннотациями из javax.validation.constraints (@NotNull, NotEmpty).
В контроллере при post запросе объект User помечаю valid.
Использую шаблонизатор thymeleaf, в html страницы вроде все пишу правильно (использую рабочие учебные примеры).
Но в контроллере ошибка не ловится, когда в запросе отправляю пустые поля.
Как исправить и что делаю не правильно?
Код User

@Entity
@Table(name = "t_user")
public class User implements UserDetails {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull(message = "Message Text")
    @NotEmpty(message = "Message Text")
    @NotBlank(message = "Message Text")
    @Min(value = 4, message = "User should enroll to minimum 4 subjects!!")
    private String username;

    @NotNull
    @NotEmpty
    @NotBlank(message = "Message Text")
    private String password;

    @Transient
    private String passwordConfirm;

    @ManyToMany(fetch = FetchType.EAGER)
    private Set<Role> roles;

    public User() {
    }
    public User(String username, String password, String passwordConfirm) {
        this.username = username;
        this.password = password;
        this.passwordConfirm = passwordConfirm;
    }    
}


Код контроллера

@Controller
public class RegistrationController {
    @Autowired
    private UserService userService;

    @GetMapping("/registration")
    public String registration(Model model) {
        model.addAttribute(new User());
        return "registration";
    }

    @PostMapping("/registration")
    public String addUser(@Valid User user, BindingResult bindingResult, Model model) {

        System.out.println(bindingResult);
        if (bindingResult.hasErrors()) {
            return "registration";
        }

        if (!user.getPassword().equals(user.getPasswordConfirm())) {
            model.addAttribute("passwordError", "Пароли не совпадают");
            return "registration";
        }

        if (!userService.saveUser(user)) {
            model.addAttribute("usernameError", "Пользователь с таким именем уже существует");
            return "registration";
        }

        return "redirect:/blog";
    }
}


Код html страницы

<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-4.dtd">
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Вход</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
    <title>Регистрация пользователя</title>
</head>
<body>
<header th:insert="blocks/header :: header"></header>
<div class="container mt-5 mb-5">
    <h1>Регистрация пользователя</h1>
    <form role="form" action="/registration" th:action="@{/registration}" th:object="${user}" method="post" >
        <div class="form-group">
            <div class="col-lg-12">
                <th:block th:if="${#fields.hasErrors('${user.*}')}">
                    <div th:utext="Common error message">Alert</div>
                </th:block>

                <div class="form-group input-group" th:classappend="${#fields.hasErrors('username')}? 'has-error'">
                    <input type="text" th:field="*{username}" class="form-control" placeholder="username" />
                    <span class="help-block" th:if="${#fields.hasErrors('username')}" th:errors="*{userName}">Incorrect title</span>
                </div>

                <div class="form-group input-group" th:classappend="${#fields.hasErrors('password')}? 'has-error'">
                    <input type="text" th:field="*{password}" class="form-control" placeholder="password" />
                    <span class="help-block" th:if="${#fields.hasErrors('password')}" th:errors="*{password}">Incorrect title</span>
                </div>

                <div class="form-group input-group" th:classappend="${#fields.hasErrors('passwordConfirm')}? 'has-error'">
                    <input type="text" th:field="*{passwordConfirm}" class="form-control" placeholder="passwordConfirm" />
                    <span class="help-block" th:if="${#fields.hasErrors('passwordConfirm')}" th:errors="*{passwordConfirm}">Incorrect title</span>
               </div>

                <div class="form-group">
                    <button type="submit" class="btn btn-success">Зарегистрироваться</button>
                </div>

            </div>
        </div>
    </form>
</div>
</body>
<div th:insert="blocks/footer :: footer"></div>
</body>
</html>

  • Вопрос задан
  • 628 просмотров
Пригласить эксперта
Ответы на вопрос 1
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Здравствуйте!
В первую очередь небольшая рекомендация - вместо того, чтобы из view напрямую получить объект User и сохранить его, создайте UserDto класс и далее получив данные из вью замаппите его в User().
По поводу возможных ошибок валидации загляните по этой ссылке - https://stackoverflow.com/questions/42423553/sprin...
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
18 апр. 2024, в 01:12
150000 руб./за проект
18 апр. 2024, в 00:10
50000 руб./за проект