Pomoc w zrozumieniu kodu Spring

0

Hej. Mam oto taki prosty kod który umożliwia edycję użytkowników:

    @GetMapping("users/{id}")
    public String editUser(@PathVariable long id,  Model model)
    {
        User user = userService.findByID(id);
        UserEditForm userEditForm = new UserEditForm(user);
        model.addAttribute("userEditForm", userEditForm);
        return "admin/userEdit";
    }

    @PostMapping("users/{id}")
    public String updateUser(@PathVariable long id, @ModelAttribute UserEditForm userEditForm,
                             BindingResult bindingResult, @ModelAttribute("allRoles") Iterable<Role> roles,
                             SessionStatus sessionStatus)
    {
        userEditValidator.validate(userEditForm, bindingResult);


        if (bindingResult.hasErrors()) {
            return "admin/userEdit";
        }

        User user = new User(userEditForm);
        userService.save(user);
        sessionStatus.setComplete();
        return "redirect:/admin/users";
    }

I teraz tak w momencie błędów przy bindowaniu powracam do tego samego widoku jednak nigdzie nie dodaje swojego obiektu (UserEditForm) do modelu tak jak w przypadku GET'a. Stąd moje pytanie, w którym miejscu w kodzie niejawnie jest to robione?

0

W tym kodzie? Nigdzie.

W Spring MVC wszystko przechodzi przez DispatcherServlet, który odwołuje się do swojego zestawu rzeczy:
https://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-servlet

Jeśli coś pod spodem pójdzie nie tak to cały łańcuch wywołań staje i nie idzie dalej.

0

Czyli jeśli pojawi się błąd przy walidacji to wszystkie obiekty w modelu z poprzedniego requesta pozostają niezmienione?
W takim przypadku jak wyjaśnić coś takiego:

 @GetMapping("users/{id}")
    public String editUser(@PathVariable long id,  Model model)
    {
        User user = userService.findByID(id);
        Iterable<Role> allRoles = roleService.getAll();
        UserEditForm userEditForm = new UserEditForm(user);
        model.addAttribute("userEditForm", userEditForm);
        model.addAttribute("allRoles", allRoles);
        return "admin/userEdit";
    }
 
    @PostMapping("users/{id}")
    public String updateUser(@PathVariable long id, @ModelAttribute UserEditForm userEditForm,
                             BindingResult bindingResult,
                             SessionStatus sessionStatus)
    {
        userEditValidator.validate(userEditForm, bindingResult);
 
        if (bindingResult.hasErrors()) {
            return "admin/userEdit";
        }
 
        User user = new User(userEditForm);
        userService.save(user);
        sessionStatus.setComplete();
        return "redirect:/admin/users";
    }

Zamiast dodawać obiekt allRoles jako atrybut sesji dodaje go do modelu i w przypadku błędu w momencie walidacji obiektu userEditForm, allRoles nie jest widoczne w widoku (tj nie ma go już w modelu) a wg. Ciebie model powinien zostać niezmieniony? Jakby ktoś mógł mi to wyjaśnić... Tzn mając błąd w formie powracamy do tego samego widoku (co jest dla mnie jasne bo zwracamy jego nazwe) z tym samym obiektem w modelu (to już nie jest jasne bo nigdzie w kodzie go nie dodaje ponownie).

0
Smutny Kaczor napisał(a):

I teraz tak w momencie błędów przy bindowaniu powracam do tego samego widoku jednak nigdzie nie dodaje swojego obiektu (UserEditForm) do modelu tak jak w przypadku GET'a. Stąd moje pytanie, w którym miejscu w kodzie niejawnie jest to robione?

Manual raczej dokładnie to opisuje, Using @ModelAttribute on a method argument. Prawdopodobnie masz w requeście parametry i one wypełniają obiekt UserEditForm.

An @ModelAttribute on a method argument indicates the argument should be retrieved from the model. If not present in the model, the argument should be instantiated first and then added to the model. Once present in the model, the argument’s fields should be populated from all request parameters that have matching names. This is known as data binding in Spring MVC, a very useful mechanism that saves you from having to parse each form field individually.

Ale to takie zgadywanie, nie widząc kodu.

0

Dzięki. Teraz już wszystko jasne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1