Поле @ModelAttribute становится пустым? - PullRequest
1 голос
/ 21 января 2020

Итак, у меня есть приложение весенней загрузки, где я могу зарегистрироваться, войти в систему и пр. c. Я хочу сделать функцию "забыл пароль". Моя пользовательская модель содержит пароль с аннотацией (@NotBlank, @Size (min = 8)). Когда я регистрирую, эти аннотации работают нормально, и я не могу зарегистрироваться, если я оставляю поля ввода пароля пустыми или слишком короткими, я хочу, чтобы эти аннотации работали и при моем методе «изменения пароля».

public class User {
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
    private Long id;

    @NotBlank(message = "{registration.usernameNotBlank}")
    @Size(min = 3, max = 32, message = "{registration.usernameSize}")
    private String username;

    @NotBlank(message = "{registration.passwordNotBlank}")
    @Size(min = 8, message = "{registration.passwordSize}")
    private String password;
}

В следующем фрагменте кода я проверяю, является ли токен подтверждения, полученный пользователем по электронной почте, действительным и существует, в случае, если я добавлю объект User в свой тимелист, чтобы он мог удерживаться на странице, где я запрашиваю новый пароль:

    @GetMapping(PATH_CONFIRM_RESET)
    public String formForNewPasswordPage(RedirectAttributes redirectAttributes,
            @RequestParam(name = "token", required = true) String confirmationToken) {

        if (userService.getConfirmationToken(confirmationToken) != null) {              
            User user = userService.getUserByConfirmationToken(confirmationToken);
            redirectAttributes.addFlashAttribute("user", user);
            return "redirect:/user/set-new-password";
        }

        return "redirect:/something-went-wrong";
    }

Работает нормально, добавляет к модели flashAttribute и использует следующий метод:

    @GetMapping(PATH_SET_NEW_PASSWORD)
    public String changePasswordForm(@ModelAttribute("user") User user) {
        System.out.println(user.toString());
        return "relatedToUserAccounts/change-password";
    }

На консоли:

 User [id=4, username=testuser, password=$2a$10$j.ZnbCtk.S.2LOUjXjrvh.NPWCvVzYaFQeMM.SQxZDnktI2.N5UCK, matchingPassword=null, email=testuser@gmail.com]

Здесь он получает Пользовательский объект хорошо, "System.out.println (user.toString ());" показывает, что объект имеет все данные. Он открывает следующий html файл:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"> 


<body>
    <section class="form">
        <form th:action="@{/user/set-new-password}" method="post" th:object="${user}">                

            <label th:text="#{changePassword.newPassword}">New password</label><br/>
            <input type="password" name="password" placeholder="Password" th:placeholder="#{password}" th:field="*{password}" autofocus/><br/>
            <input type="password" name="matchesPassword" placeholder="Password" th:placeholder="#{password}" th:field="*{matchingPassword}" /><br/>

            <input type="submit" class="submit-button" th:value="#{changePassword.submitButton}"/>
        </form>
    </section>
</body>

И вызывается следующий метод, если пользователь нажал кнопку отправки на этом html:

@PostMapping(PATH_SET_NEW_PASSWORD)
    public String changePasswordOfUserAccount(@ModelAttribute("user") User user, BindingResult result) {
        loggerInfoIsCalled(PATH_SET_NEW_PASSWORD, request);
        System.out.println(user.toString());
        return "redirect:/user/login";
    }

На консоли:

User [id=null, username=null, password=testuser, matchingPassword=testuser, email=null]

Проблема возникает здесь: объект User больше не имеет правильных полей «username» и «email». И то, и другое имеет значение «null», в то время как у него есть новый пароль и новый совпадающий пароль.

Например: «changePasswordForm (@ModelAttribute (« user ») User user)» System.out.println () поместил это в мой консоль:

User [id=4, username=testuser, password=$2a$10$j.ZnbCtk.S.2LOUjXjrvh.NPWCvVzYaFQeMM.SQxZDnktI2.N5UCK, matchingPassword=null, email=testuser@gmail.com]

Я получил страницу HTML, где я могу дать новый пароль, нажать на кнопку, и объект User теперь выглядит так:

User [id=null, username=null, password=testuser, matchingPassword=testuser, email=null]

id, username, email стал пустым.

Я бы предпочел не создавать метод, который проверяет все ограничения, которые я ввел в модель User (вызовите метод для новых паролей, чтобы убедиться, что он не пустой или не слишком короткий ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...