Hej. Używając Springa MVC, przekazuję do widoku kilka list obiektów. Użytkownika może wybrać po jednym obiekcie (które reprezentuje zwykły napis na stronie) z każdej listy. Następnie wysyłając metodą POST, strona musi przechwycić formularz i z tych wybranych obiektów utworzyć nową listę. Jednak przy próbuje wysłania formularza otrzymuję komunikat "Failed to convert property value of type java.lang.String[] to required type java.util.List for property ingredients; nested exception is java.lang.IllegalStateException: Cannot convert value of type java.lang.String to required type tacos.domain.Ingredient for property ingredients[0]: no matching editors or conversion strategy found".
@ModelAttribute(name = "taco")
public Taco taco() {
return new Taco();
}
@GetMapping
public String showDesignForm(Model model) {
List<Ingredient> ingredients = new ArrayList<>();
ingredientRepository.findaAll().forEach(ingredients::add);
Type[] types = Ingredient.Type.values();
for (Type type : types) {
model.addAttribute(type.toString().toLowerCase(), filterByType(ingredients, type));
}
return "design";
}
@PostMapping
public String processDesign(@Valid Taco taco, Errors errors, @ModelAttribute Order order) {
if (errors.hasErrors()) {
return "design";
}
Taco saved = designRepo.save(taco);
order.addDesign(saved);
return "redirect:/orders/current";
}
Widok html:
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Aplikacja Taco Cloud</title>
</head>
<body>
<h1>Przygotuj własne Taco!</h1>
<img th:src="@{/images/TacoCloud.png}" alt="">
<form method="POST" th:object="${taco}">
<span class="validationError"
th:if="${#fields.hasErrors('ingredients')}"
th:errors="*{ingredients}">Ingredient Error</span>
<div class="grid">
<div class="ingredient-group" id="wraps">
<h3>Wybierz rodzaj mąki:</h3>
<div th:each="ingredient : ${wrap}">
<input type="checkbox" th:name="ingredients" th:value="${ingredient.id}"/>
<span th:text="${ingredient.name}">Składnik</span><br/>
</div>
</div>
<div class="ingredient-group" id="proteins">
<h3>Wybierz mięso:</h3>
<div th:each="ingredient : ${protein}">
<input type="checkbox" th:name="ingredients" th:value="${ingredient.id}"/>
<span th:text="${ingredient.name}">Składnik</span>
</div>
</div>
<div class="ingredient-group" id="cheeses">
<h3>Wybierz sery:</h3>
<div th:each="ingredient : ${cheese}">
<input type="checkbox" th:name="ingredients" th:value="${ingredient.id}" />
<span th:text="${ingredient.name}">Składnik</span><br>
</div>
</div>
<div class="ingredient-group" id="veggies">
<h3>Wybierz warzywa:</h3>
<div th:each="ingredient : ${veggies}">
<input type="checkbox" th:name="ingredients" th:value="${ingredient.id}" />
<span th:text="${ingredient.name}">Składnik</span><br>
</div>
</div>
<div class="ingredient-group" id="sauces">
<h3>Wybierz sosy:</h3>
<div th:each="ingredient : ${sauce}">
<input type="checkbox" th:name="ingredients" th:value="${ingredient.id}"/>
<span th:text="${ingredient.name}">Składnik</span>
</div>
</div>
</div>
<div>
<h3>Nadaj nazwę przygotowanemu taco:</h3>
<input type="text" th:field="*{name}"/>
<span class="validationError"
th:if="${#fields.hasErrors('name')}"
th:errors="*{name}">Name Error</span>
<br/>
<br>
<button>Wyślij swoje zamówienie</button>
</div>
</form>
</body>
</html>