Wysłanie dwóch obiektów w jednym formularzu

0

Witam, wydaje mi się że znalazłem rozwiązanie na mój problem, ale niestety nie rozumiem o jakie rozwiązanie chodzi.

https://stackoverflow.com/questions/16122257/how-to-pass-two-objects-to-use-in-a-form-using-thymeleaf

Oh, it's because we didn't set a name for them. The input name has to match the bean field name.
– Sotirios Delimanolis Apr 20 '13 at 20:06

Ja rozumiem to tak że muszę stworzyć beana o takiej samej nazwie jak input?
Proszę o wskazówkę albo proste wytłumaczenie.

0

Nic nie kombinuj, tylko zdefiniuj klasę złożoną z tych dwóch docelowych beanów i beana takiej klasy oczekuj w kontrolerze.Wyciągniesz jednego i drugiego beana z takiego agregatu i robisz co tam chcesz.

0
cs napisał(a):

Nic nie kombinuj, tylko zdefiniuj klasę złożoną z tych dwóch docelowych beanów i beana takiej klasy oczekuj w kontrolerze.Wyciągniesz jednego i drugiego beana z takiego agregatu i robisz co tam chcesz.

Czyli rozumiem podejście rozwiązanie do th:value jest poprawne.
Czy o to ci chodziło?

tylko zdefiniuj klasę złożoną z tych dwóch docelowych>

    @Bean
    public User creatUser()
    {
        User user = new User();
        return user;
    }
    @Bean
    public Klient creatklient()
    {
        Klient klient = new Klient();
        return klient;
    }

beana takiej klasy oczekuj w kontrolerze.>

    @RequestMapping (value = "/osoba", method = RequestMethod.POST)
    public String dodaj ( Klient klient , User user ) throws RecordNotFoundException {
        klient.setUsers((Set<User>) userService.getUserById(user.getId()));
        klientServicee.createOrUpdateKlient(klient);
        return "redirect:/osoba";
    }

0

Miałem na myśli coś takiego:

public class Person{
  User user;
  Client client;
  ...
}

...
@RequestMapping (value = "/osoba", method = RequestMethod.POST)
public String dodaj (Person person) throws RecordNotFoundException {
  Client client = person.getPerson();
  User user = person.getUser();
  ...
  return "redirect:/osoba";
}
0

Zrobiłem tak jak ty, niestety ale po wypełnienie formularza zostaje przesłany null.

0

Pewnie coś nie tak w formularzu, kombinowałeś z th:value. Zrób coś takiego:

 <form method="post" action="#" th:action="@{/osoba}" th:object="${person}">
    <!-- pola bean'a User-->
    <input id="lastName" type="text"  th:field="*{user.lastName}">
    ...
    <!-- pola bean'a Client-->
    <input id="login" type="text" th:field="*{client.login}">
</form>
0
<form th:object="${userKlient}" th:action="@{/osoba}" method="post">
                            <div class="form-row">
                                <div class="form-group col-md-4">
                                    <label >Imię</label>
                                    <input id="imie" type="text" class="form-control"  th:field="${klient.imie}" >
                                </div>

                                <div class="form-group col-md-4">
                                    <label >Nazwisko</label>
                                    <input id="nazwisko" type="text" class="form-control" th:field="${klient.nazwisko}" >
                                </div>



                                <div class="form-group  col-md-4">
                                    <div class="label-flex">
                                        <label>Opiekun</label>
                                    </div>
                                    <div class="select-list" id="selectlist"  >
                                        <select  >
                                            <option > -- </option>

                                            <option
                                                        th:each=" users : ${user}"
                                                        th:value="${users.UserId}"
                                                        th:utext="${users.lastName}"
                                            />
                                        </select>
                                </div>
                                </div>
                            </div>
                            <div class="form-submit" id="przyciski">
                                <input type="submit" value="Dodaj" class="submit" id="submit" name="Dodaj" />
                                <input type="submit" value="Wyjdź" class="submit" id="reset" name="Wyjdź" />
                            </div>
                        </form>

Dobra poddaje się, ogólnie chce stworzyć formularz w którym zapisuje się dane klienta jednocześnie trzeba dodać przez select user (w domyśle ma to być opiekun).
Jeżeli uzupełniam formularz i tylko wyświetlam listę opiekunów to wszystko działa. Bazy łącze jeden do wielu.

0

Z tego wynika, że w tym formularzu nie tworzysz nowego usera. Chcesz dodać jednego (lub kilku) spośród już istniejących jako opiekuna do nowo tworzonego klienta? Do tego nie trzeba tworzyć dwóch obiektów w formularzu. Ostania próba:
Tworzysz w kontrolerze atrybut modelu z listą wszystkich dostępnych dla klienta userów:

@ModelAttribute("patrons")
    List<User> allUsers() {
        return userRepository.findAll();
    }

W formularzu tworzysz selecta:

<form th:object="${klient}" th:action="@{/osoba}" method="post">
  ...
                    <select th:field="*{users}" name="users" multiple="multiple">
                        <option th:each="patron : ${patrons}"
                                th:value="${patron}"
                                th:text="${patron.lastName}">Opiekun
                        </option>
                    </select>
   ...

W kodzie formularza masz sporo błędów, jak korzystasz z th:object to odwołanie do pola user odbywa się przez gwiazdkę: *{user} a nie ${user}. Raz piszesz, że masz w klasie Klient pole users a w formularzu robisz coś takiego:

<option
   th:each="users : ${user}"
   th:value="${users.UserId}"
   th:utext="${users.lastName}"
 />

a chyba powinno być:

<option
   th:each="user : *{users}"
   th:value="${user.UserId}"
   th:utext="${user.lastName}"
 />
0

Dziękuję bardzo za wyjaśnienie.

0

Dobra potrzebuję jeszcze pomocy.

                                 <select  th:field="*{user}" name="user" multiple="multiple" >
                                            <option> -- </option>
                                            <option  th:each=" users : ${patrons}"
                                                     th:value="${users.UserId}"
                                                     th:utext="${users.lastName}"/>
                                        </select>


wyskakuje mi błąd dotyczący pierwszej lin selecta, nie wiem totalnie czego dotyczy błąd.

Error during execution of processor 'org.thymeleaf.spring5.processor.SpringSelectFieldTagProcessor' (template: "dodaj" - line 178, col 50)>

    @RequestMapping (value = "/dodaj" , method = RequestMethod.GET)
    public String tworz (Model model){
        model.addAttribute("klient" , new Klient());
        model.addAttribute("user" , new User());
        return "dodaj";
    }

    @ModelAttribute("patrons")
    List<User> allUsers() {
        return userService.getAllUser();

    }


Jestem jakąś amebą umysłową

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