Почему контроллер должен добавить модель при ошибке привязки - PullRequest
0 голосов
/ 06 декабря 2018

В контроллере Spring-Boot во время регистрации пользователя, если есть ошибка привязки, мой контроллер возвращает пользователя на страницу регистрации, но в моей реализации модель, кажется, отсутствует.

Например, я обычно вижу в учебные пособия

    @PostMapping
public String registerUserAccount(@ModelAttribute("user") @Valid UserRegistrationDto userDto, 
                                  BindingResult result){

    User existing = userService.findByEmail(userDto.getEmail());
    if (existing != null){
        result.rejectValue("email", null, "There is already an account registered with that email");
    }

    if (result.hasErrors()){
        return "registration";
    }

    userService.save(userDto);
    return "redirect:/registration?success";
}

Что, если есть ошибки привязки, возвращает "регистрацию"

Мой контроллер очень похож:

    @PostMapping("/user/register")
public String registerNewUser(@ModelAttribute("user") @Valid RegisterUserDTO registerUserDTO,
                              BindingResult bindingResult,
                              Model model,
                              HttpServletRequest request,
                              Errors errors) {
    User existing = userService.findUserByEmail(registerUserDTO.getEmail());
    if (existing != null) {
        bindingResult.rejectValue("email", null, "There is already an account with that Email");
    }
    if (bindingResult.hasErrors()) {
        return "register";
    }
    userService.createUser(registerUserDTO);
    return "redirect:/registration?success";
 }
}

Однако, когда я возвращаю «регистр», в стеке возникает ошибка привязки, что соответствует моему первому тегу тимелиста, связанному с объектом.

Если я меняю контроллер POSTЧтобы добавить модель в явном виде:

        if (bindingResult.hasErrors()) {
        model.addAttribute(registerUserDTO);
        return "register";
    }

Затем она работает, возвращая страницу с моделью и ранее введенными данными.

Почему я должен явно добавить модель вreturn?

ОБНОВЛЕНИЕ

Это также не работает:

    @PostMapping("/user/register")
public String registerNewUser(@ModelAttribute("user") @Valid RegisterUserDTO registerUserDTO,
                              BindingResult bindingResult) {
    User existing = userService.findUserByEmail(registerUserDTO.getEmail());
    if (existing != null) {
        bindingResult.rejectValue("email", null, "There is already an account with that Email");
    }
    if (bindingResult.hasErrors()) {
        return "register";

1 Ответ

0 голосов
/ 06 декабря 2018

Это сработало:

    @PostMapping("/user/register")
    public String registerNewUser(@ModelAttribute("registerUserDTO") @Valid RegisterUserDTO registerUserDTO,
                              BindingResult bindingResult) {
    User existing = userService.findUserByEmail(registerUserDTO.getEmail());
    if (existing != null) {
           bindingResult.rejectValue("email", null, "There is already an account with that Email");
    }
    if (bindingResult.hasErrors()) {
        return "register";
    }
    userService.createUser(registerUserDTO);
    return "redirect:/registration?success";
}

Как указал М.Дениум, имя @ModelAttribute должно совпадать с именем экземпляра объекта поддержки, используемого в контроллере GET.В моем контроллере GET у меня было:

    @GetMapping("/user/register")
String registerForm(Model model) {
    RegisterUserDTO registerUserDTO = new RegisterUserDTO();
    model.addAttribute(registerUserDTO);
    return "register";
}

Так что @ModelAttribute должен совпадать, т.е. @ModelAttribute (" registerUserDTO ")

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