gpt4 book ai didi

java - 无法将 java.lang.String[] 类型的属性值转换为所需类型 java.util.List

转载 作者:太空宇宙 更新时间:2023-11-04 09:06:56 27 4
gpt4 key购买 nike

我正在关注 Spring in Action 5,并且在按下提交按钮后创建 Taco 模型时遇到问题。这是我设计的 Taco Controller 类:

    @GetMapping
public String showDesignForm(Model model){
List<Ingredient> ingredients = new ArrayList<>();
ingredientRepository.findAll().forEach(i -> ingredients.add(i));

Type[] types = Ingredient.Type.values();
for (Type type : types){
model.addAttribute(type.toString().toLowerCase(),
filterByType(ingredients, type));
}
return "welcomePage";
}
@ModelAttribute(name = "taco")
public Taco taco(){
return new Taco();
}

@PostMapping
public String processDesign(@Valid Taco taco, Errors errors, @ModelAttribute Order order){
if(errors.hasErrors()) {
return "welcomePage";
}
Taco saved = tacoRepository.save(taco);
order.addDesign(saved);
return "redirect:/orders/current";
}

以及我捕获的错误消息:

    org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'taco' on field 'ingredients': rejected value [CARN]; codes [typeMismatch.taco.ingredients,typeMismatch.ingredients,typeMismatch.java.util.List,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [taco.ingredients,ingredients]; arguments []; default message [ingredients]]; default message [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 'org.server.models.Ingredient' for property 'ingredients[0]': no matching editors or conversion strategy found]

Taco 实体看起来像:

@Data
@Entity
public class Taco {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private Date createdAt;
@NotNull
@Size(min = 3, message="Name must be at least 3 characters long")
private String name;
@ManyToMany(targetEntity = Ingredient.class)
@Size(min=1, message="You must choose at least 1 ingredient")
private List<Ingredient> ingredients = new ArrayList<>();

@PrePersist
void createdAt(){
this.createdAt = new Date();
}

}

我的实体与成分:

@Data
@RequiredArgsConstructor
@NoArgsConstructor(access = AccessLevel.PRIVATE, force = true)
@Entity
public class Ingredient {

@Id
private final String id;
private final String name;
@Enumerated(EnumType.STRING)
private final Type type;

public static enum Type{
WRAP, PROTEIN, VEGGIES, CHEESE, SAUCE
}
}

这是 html 页面,必须使用所选成分创建新的 Taco 对象:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Testing Firs Page</title>
</head>
<body>
<h1>Design your taco!</h1>
<img th:src="@{/images/taco.jpg}" alt="myImage"/>

<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>Designate your wrap:</h3>
<div th:each="ingredient : ${wrap}">
<input name="ingredients" type="checkbox" th:value="${ingredient.id}" />
<span th:text="${ingredient.name}">INGREDIENT</span><br/>
</div>
</div>

<div class="ingredient-group" id="proteins">
<h3>Pick your protein:</h3>
<div th:each="ingredient : ${protein}">
<input name="ingredients" type="checkbox" th:value="${ingredient.id}" />
<span th:text="${ingredient.name}">INGREDIENT</span><br/>
</div>
</div>

<div class="ingredient-group" id="cheeses">
<h3>Choose your cheese:</h3>
<div th:each="ingredient : ${cheese}">
<input name="ingredients" type="checkbox" th:value="${ingredient.id}" />
<span th:text="${ingredient.name}">INGREDIENT</span><br/>
</div>
</div>

<div class="ingredient-group" id="veggies">
<h3>Determine your veggies:</h3>
<div th:each="ingredient : ${veggies}">
<input name="ingredients" type="checkbox" th:value="${ingredient.id}" />
<span th:text="${ingredient.name}">INGREDIENT</span><br/>
</div>
</div>

<div class="ingredient-group" id="sauces">
<h3>Select your sauce:</h3>
<div th:each="ingredient : ${sauce}">
<input name="ingredients" type="checkbox" th:value="${ingredient.id}" />
<span th:text="${ingredient.name}">INGREDIENT</span><br/>
</div>
</div>
</div>

<div>


<h3>Name your taco creation:</h3>
<input type="text" th:field="*{name}"/>
<span class="validationError"
th:if="${#fields.hasErrors('name')}"
th:errors="*{name}">Name Error</span>
<br/>

<button>Submit your taco</button>
</div>
</form>
</body>
</html>

我该如何解决这个问题?感谢您的提前。

最佳答案

在 Spring in Action 中,您应该添加 IngredientByIdConverter 类。该类将 Ingredient 转换为 String。

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

private IngredientRepository ingredientRepo;

@Autowired
public IngredientByIdConverter(IngredientRepository ingredientRepo) {
this.ingredientRepo = ingredientRepo;
}

@Override
public Ingredient convert(String id) {
return ingredientRepo.findById(id);
}
}

关于java - 无法将 java.lang.String[] 类型的属性值转换为所需类型 java.util.List,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60126036/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com