forumularz thymeleaf i nulle w kontrolerze

0

napisalem taki o to form:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="ISO-8859-1"></meta>
<title>Plan a visit!</title>
</head>
<body>
	<form action="visit.do" th:action="@{/visit.do}" th:object="${Visit}" method="post">
		
		<label for="date">Date:</label>
			<input type="text" th:field="*{date}"/>
		
		<label for="pet">Pet:</label>
			<select th:field="*{pet}" th:remove="all-but-first">
				<option th:each="pet : ${petList}" th:value="${pet}" th:text="${pet.petName}" ></option>
			</select>
		
		<label for="vet">Vet:</label>
			<select th:field="*{vet}" th:remove="all-but-first">
				<option th:each="vet : ${vetList}" th:value="${vet}" th:text="${vet.firstName} +' '+ ${vet.lastName}" ></option>
			</select>
		<input type="submit"/>
	
	</form>
</body>
</html>

odpowiadajacy mu kontroler:

@Controller
public class VisitController {

	@Autowired
	ServiceDao<Pet> petService;

	@Autowired
	@Qualifier("vetService")
	ServiceDao<Vet> vetService;

	@RequestMapping("/setVisit")
	public String visit(Model model) {
		List<Vet> vetList = vetService.getAll();
		List<Pet> petList = petService.getAll();
		model.addAttribute("vetList", vetList);
		model.addAttribute("petList", petList);
		model.addAttribute("Visit", new Visit());
		return "visitForm";
	}

	@RequestMapping(value = "visit.do", method = RequestMethod.POST)
	public String visitDo(@ModelAttribute(value="Visit") Visit visit, BindingResult result
			) {
		System.out.println(visit);
		return "visitForm";
	}

}

w widoku wygenerowanym motoda get wszystko jest ok, tzn wartosci z DB wczytuja sie do list i mozna w <select> wybrac odpowiednie encje. Jednak do kontrolera trafiaja nulle, a output z sysout'u jest :

Visit [id=0, date=1111-11-11, pet=null, vet=null]

chcialem zoabczyc co jest w modelu tak wiec zmienilem troche kontroler:

@RequestMapping(value = "visit.do", method = RequestMethod.POST)
	public String visitDo(@ModelAttribute(value="Visit") Visit visit, BindingResult result, Model model
			) {
		System.out.println(model.toString());
		System.out.println(visit);
		return "visitForm";
	}

i mam z tego taki output:

Field error in object 'Visit' on field 'pet': rejected value [Pet [id=1, petName=q, owner=null]]; codes [typeMismatch.Visit.pet,typeMismatch.pet,typeMismatch.pl.kaczynski.model.Pet,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [Visit.pet,pet]; arguments []; default message [pet]]; default message [Failed to convert property value of type [java.lang.String] to required type [pl.kaczynski.model.Pet] for property 'pet'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [pl.kaczynski.model.Pet] for property 'pet': no matching editors or conversion strategy found]
Field error in object 'Visit' on field 'vet': rejected value [Vet [id=1, firstName=Abdul, lastName=Koza]]; codes [typeMismatch.Visit.vet,typeMismatch.vet,typeMismatch.pl.kaczynski.model.Vet,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [Visit.vet,vet]; arguments []; default message [vet]]; default message [Failed to convert property value of type [java.lang.String] to required type [pl.kaczynski.model.Vet] for property 'vet'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [pl.kaczynski.model.Vet] for property 'vet': no matching editors or conversion strategy found]}
Visit [id=0, date=1111-11-11, pet=null, vet=null]

Mimo tego (chyba) dosc jasnego stacktrace'u nie jestem w stanie tego ugryzc.

0

Do pól obiektu Visit pet i vet przypisujesz Stringi z parametrów widoku petName i firstName + lastName.
Możesz np. przekazać w parametrach id pet i vet, użyć @InitBinder, pobrać pet i vet po id i ustawić je jako pola Visit.
Nie wiem czy nie ma jakiegoś sprytniejszego sposóbu.

0

tzn, mi sie wydaje ze to nie sa wartosci (petName) i (firstName lastName), tylko to co jest w th:value, czyli obiekty, jednak w wersji toString, i teraz zeby nie robic takiego "beeee" rozwiazania, z pobieraniem id, wyciagnaniem i zgrywaniem, przyszlo mi na mysl ze może da sie zrobic parser typu String->Pet/Vet. Samo napisanie parsera raczej latwe zadanie, jednak gorzej z jakims "podpieciem" go, tak zeby to przy przejsciu do kontrollera ta konwersja customowego parsera sie dokonywala.

po szybkich googlach znalazlem to:
http://stackoverflow.com/questions/25234357/select-tag-with-object-thymeleaf-and-spring-mvc
jednak teraz robie sobie przewe bo juz mnie oczy szczypia .... ;)

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