Thymeleaf возвращает массив String вместо List <Object> - PullRequest
0 голосов
/ 25 июня 2018

Я учусь использовать Spring Boot и Thymeleaf. У меня есть проблема, когда я предоставляю список определенных объектов в списке форм на странице Thymeleaf. Когда пользователь выбирает значения и публикует результаты, результатом является строка выбранных объектов, несовместимая с объектом, в котором я хотел сохранить значения.

Это может звучать как глоток, поэтому ниже приведен код.

Мой вопрос: есть ли способ гарантировать, что Thymeleaf возвращает список объектов?

Ввод: класс передает группу ингредиентов в форму Этот класс передает в форму список класса Ingredient (фильтрация для этого не имеет значения - список вставляется в качестве значения атрибута модели, а ключ является типом ингредиента)

@GetMapping
public String showDesignForm(Model model) {
    List<Ingredient> ingredients = new ArrayList<>();
    ingredientRepo.findAll().forEach(i -> ingredients.add(i));  
    Type[] types = Ingredient.Type.values();
    for (Type type : types) {
        model.addAttribute(type.toString().toLowerCase(), filterByType (ingredients, type));
    }   
    model.addAttribute("taco", new Taco()); 
    return "design";
}

Thymeleaf берет этот список и отображает его в флажках

<!DOCTYPE html>
<html
xmlns:th="http://www.thymeleaf.org">
<head>
<title>Taco Cloud</title>
<link rel="stylesheet" th:href="@{/styles.css}" />
</head>
<body>
<h1>Design your taco!</h1>
<img th:src="@{/images/TacoCloud.png}"/>
<form method="POST" th:object="${taco}">
<div class="grid">
<div class="ingredient-group">
<h3>Designate your wrap:</h3>
<div th:each="ingredient : ${wrap}">
<input name="ingredients" type="checkbox" th:value="${ingredient}" />
<span th:text="${ingredient.name}">INGREDIENT</span><br/>
</div>
</div>
<div class="ingredient-group">
<h3>Pick your protein:</h3>
<div th:each="ingredient : ${protein}">
<input name="ingredients" type="checkbox" th:value="${ingredient}" />
<span th:text="${ingredient.name}">INGREDIENT</span><br/>
</div>
</div>
<div class="ingredient-group">
<h3>Choose your cheese:</h3>
<div th:each="ingredient : ${cheese}">
<input name="ingredients" type="checkbox" th:value="${ingredient}" />
<span th:text="${ingredient.name}">INGREDIENT</span><br/>
</div>
</div>
<div class="ingredient-group">
<h3>Determine your veggies:</h3>
<div th:each="ingredient : ${veggies}">
<input name="ingredients" type="checkbox" th:value="${ingredient}" />
<span th:text="${ingredient.name}">INGREDIENT</span><br/>
</div>
</div>
<div class="ingredient-group">
<h3>Select your sauce:</h3>
<div th:each="ingredient : ${sauce}">
<input name="ingredients" type="checkbox" th:value="${ingredient}" />
<span th:text="${ingredient.name}">INGREDIENT</span><br/>
</div>
</div>
</div>
<div>
<h3>Name your taco creation:</h3>
<input type="text" th:field="*{name}"/>
<br/>
<button>Submit your taco</button>
</div>
</form>
</body>
</html>

Целевой класс: ожидается, что возвращаемое значение будет List

package tacos;

import java.util.Date;
import java.util.List;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import lombok.Data;

@Data
public class Taco {

    private Long id;

    private Date createdAt;

    @NotNull
    @Size(min=5, message="Name must be at least 5 characters long")
    private String name;
    @Size(min=1, message="You must choose at least 1 ingredient")
    private List<Ingredient> ingredients;
}

Ошибка:

Ошибка поля в объекте 'taco' на поле 'ингредиенты': отклоненное значение [Ингредиент (id = FLTO, имя = мука лепешка, тип = WRAP), Ингредиент (id = CHED, имя = Чеддер, тип = CHEESE)] ; коды [typeMismatch.taco.ingredients, typeMismatch.ingredients, typeMismatch.java.util.List, typeMismatch]; аргументы [org.springframework.context.support.DefaultMessageSourceResolvable: codes [taco.ingredients, ингридиенты]; аргументы []; сообщение по умолчанию [ингредиенты]]; сообщение по умолчанию [Не удалось преобразовать значение свойства типа «java.lang.String []» в требуемый тип «java.util.List» для свойства «ингридиенты»; вложенное исключение - java.lang.IllegalStateException: невозможно преобразовать значение типа 'java.lang.String' в требуемый тип 'tacos.Ingredient' для ингредиентов свойства [0]: не найдено подходящих редакторов или стратегии преобразования]

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Я столкнулся с той же проблемой в некотором коде, но я преодолел ее с помощью Spring JPA. Но если вы использовали не Spring Spring JPA, вы можете использовать этот конвертер для вашего приложения. Согласно вашему коду, идентификатором свойства Ingredient является String. Так что код будет.

@Component
public class IngredientConverter implements Converter<String, Ingredient> {

private final IngredientRepo ingredientRepo;

@Autowired
public IngredientConverter(IngredientRepo ingredientRepo) {

    this.ingredientRepo = ingredientRepo;
}

@Override
public Ingredient convert(String source) {

      List<Ingredient> ingredients = new ArrayList<>();

      ingredientRepo.findAll().forEach(i -> ingredients.add(i));

      for (Ingredient ingredient : ingredients) {

        // You may use equal() method
        if (ingredient.getId() == source)

            return ingredient;
      }

      return null;
   }

}
0 голосов
/ 16 июля 2018

Я наткнулся на видео, которое помогло создать конвертер между результатом String страницы Thymeleaf и методом POST в Spring.

https://www.youtube.com/watch?v=e9mlrHyn73w&t=627s

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...