Dwa obiekty w formularzu html Thymeleaf

Dwa obiekty w formularzu html Thymeleaf
PU
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:7
0

Próbuję wysłać dwa obiekty formularzem POST z wykorzystaniem Thymeleafa. Na chwilę obecną mój kod wygląda tak(u mnie działa ;) ):

Kopiuj
<form th:action="@{/save}" method="post">
		<p>Nazwa produktu: <input type="text"th:field="${formProduct.name}"/></p>
		<p>Opis produktu: <textarea cols="60" rows="5" th:field="${formProduct.description}"></textarea></p>
		<p>Ilość magazynowa: <input type="number"step="1"min="0"th:field="${formProduct.quantity}"/></p>
		<p>Cena: <input type="number"step="0.01"min="0"th:field="${formProduct.price}"/></p>
		<p>Indeks produktu: <input type="text"th:field="${formProduct.index}"/></p>
		<div th:object="${producer}">Wybierz producenta:
		<select th:field="${producer.id}">
			<option value="">-------------</option>
			<option th:each="producer:${producers}" th:value="${producer.id}" th:text="${producer.name}"></option>			
		</select>
		</div>
		<p><input type="submit"value="Dodaj product"/></p>
	</form>

Controller do tego:

Kopiuj
@PostMapping("/save")
	public String addProduct(@ModelAttribute Product formProduct, @ModelAttribute Producer producer, Model model) {
		if(checkNotEmpty(formProduct)) {
		model.addAttribute("formProduct", formProduct);
		model.addAttribute("producer", producer);
		formProduct.setId(null);
		productService.addProduct(formProduct, producer.getId());
		}
		return "redirect:/admin";
	}

Problem polega na tym, że do pól obiektu producer, które mają taką samą nazwę jak pola obiektu formProduct Thymeleaf przypisuje mi wartości z obiektu formProduct(description) i odwrotnie(formProduct ma przypisywane id z obiektu producer).
Jak widać obszedłem ten problem w mało elegancki sposób. Jak to zrobić, żeby to miało ręce i nogi?

MrMadMatt
  • Rejestracja:ponad 9 lat
  • Ostatnio:16 dni
  • Postów:373
0

Wysyłaj jeden obiekt POSTem który jest wolny od problemu zduplikowanych nazw.

PU
Ale potrzebuję wysłać dwa, ewentualnie jeden obiekt + id drugiego (nie wiem tylko jak wydłubać to id na poziomie Thymeleafa). Między obiektami jest relacja ManyToOne i chcę żeby były zapisywane do bazy jednocześnie. Ewentualnie tak jak jest, też działa i jak nic lepszego nie wymyślę, to zostaje.
Charles_Ray
  • Rejestracja:około 17 lat
  • Ostatnio:około 6 godzin
  • Postów:1875
2

Dlaczego nie możesz przesyłać jednego obiektu reprezentującego cały formularz tylko kilka?


”Engineering is easy. People are hard.” Bill Coughran
Zobacz pozostałe 2 komentarze
PU
Myślałem o tym ale już chyba wolę zostać przy moim rozwiązaniu z nullowaniem id w Product. Nie trzeba tworzyć dodatkowych klas i przepisywać wartości. Mniej kodu :) Myślałem, że jest jakiś sposób w Thymeleaf'ie na to.
PU
A tak przy okazji, bo ja jeszcze nie mam komercyjnego doświadczenia. Takie tworzenie klas pomocniczych tylko po to by przesłać dane z formularza jednym obiektem, to jest powszechna praktyka, czy bardziej obejście problemu na około?
TR
@pulaas: to powszechne podejście, nie ma się co bać
Charles_Ray
Nawet ma to swoją nazwę: Data Transfer Object (DTO)
PU
Dzięki za odpowiedzi. Rozjaśniło się trochę.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.