【问题标题】:Thymeleaf returning a String array instead of List<Object>Thymeleaf 返回一个字符串数组而不是 List<Object>
【发布时间】:2018-12-04 02:41:21
【问题描述】:

我正在学习如何使用 Spring Boot 和 Thymeleaf。我有一个问题,我将表单列表中的特定对象列表提供给 Thymeleaf 页面。当用户选择值并发布结果时,结果是所选对象的字符串,与我想要存储值的对象不兼容。

这听起来有点拗口,下面是代码。

我的问题是:有没有办法确保 Thymeleaf 返回一个对象列表?

输入:一个类将一堆成分传递给表单 此类将类成分列表传递给表单(过滤对此无关紧要 - 插入一个列表作为模型属性的值,键是一种成分)

@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;
}

错误:

字段 'ingredients' 上的对象 'taco' 中的字段错误:拒绝值 [Ingredient(id=FLTO, name=Flour Tortilla, type=WRAP),Ingredient(id=CHED, name=Cheddar, type=CHEESE)] ;代码 [typeMismatch.taco.ingredients,typeMismatch.ingredients,typeMismatch.java.util.List,typeMismatch];参数 [org.springframework.context.support.DefaultMessageSourceResolvable:代码 [taco.ingredients,ingredients];论据 [];默认消息[成分]];默认消息 [无法将类型“java.lang.String[]”的属性值转换为属性“ingredients”所需的类型“java.util.List”;嵌套异常是 java.lang.IllegalStateException:无法将类型“java.lang.String”的值转换为属性“ingredients[0]”所需的类型“tacos.Ingredient”:找不到匹配的编辑器或转换策略]

【问题讨论】:

    标签: java spring thymeleaf


    【解决方案1】:

    我在一些代码中遇到了同样的问题,但我通过使用 Spring JPA 克服了它。但如果您使用的不是 Spring JPA,您可以将此转换器用于您的应用程序。根据您的代码,成分的属性 id 是字符串。所以代码将是。

    @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;
       }
    
    }
    

    【讨论】:

    • 很好的答案,但这真的有必要吗?这将需要很多代码:/必须有另一种方法。
    【解决方案2】:

    我看到一个视频,它帮助在 Thymeleaf 页面的 String 结果和 Spring 中的 POST 方法之间创建了一个转换器。

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

    【讨论】:

      【解决方案3】:

      您应该将private List&lt;Ingredient&gt; ingredients; 更改为private List&lt;String&gt; ingredients;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-11
        • 2016-03-19
        • 1970-01-01
        • 2011-07-27
        • 1970-01-01
        • 2014-07-11
        • 2015-05-10
        • 1970-01-01
        相关资源
        最近更新 更多