【发布时间】:2019-12-11 15:45:15
【问题描述】:
尝试将使用 th:value 的自定义对象从 View 传递到 Controller,但只能通过 th:value 传递 Java 的原始数据类型。有什么办法可以通过th:value发送复杂的对象@
我是 spring 新手,正在尝试一些随机的东西。 这是一个简单的网络应用程序。
我想要做什么:
我有一个创建团队的表格。该表单包括一个团队名称的文本字段和一堆用于选择团队成员的复选框。对于每个选中的复选框,应将相应的成员添加到团队列表中。
我尝试使用 thymeleaf 的 th:value 属性将对象从 View 传递到 Controller。但我只能使用 th:value
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Create your Team</title>
</head>
<body>
<h1>Create your dream team</h1>
<form method="post" th:object="${team}">
<span>Name of the team</span>
<input type="text" th:field="*{name}">
<div th:each="player : ${playersList}">
<input type="checkbox" name="players" th:value="${player}" th:valueType="com.example.kkvamshee.Cricket.Player">
<span th:text="${player.name}">Player Name</span>
</div>
<button type="submit">Submit your team</button>
</form>
</body>
</html>
创建团队控制器.java
package com.example.kkvamshee.Cricket.web;
import com.example.kkvamshee.Cricket.Player;
import com.example.kkvamshee.Cricket.Team;
import com.example.kkvamshee.Cricket.data.JdbcPlayerRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.validation.Valid;
import java.util.List;
@Slf4j
@Controller
@RequestMapping("/create-your-team")
public class CreateTeamController {
....
@GetMapping
public String showSelectTeamPage(Model model) {
List<Player> playersList = playerRepo.findAll();
model.addAttribute("playersList", playersList);
model.addAttribute("team", new Team());
return "teamCreationForm";
}
.....
}
团队.java
package com.example.kkvamshee.Cricket;
import lombok.Data;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.List;
@Data
public class Team {
@NotNull private String name;
@Size(min = 3, max = 3, message = "You can only have 3 members on the team")
private List<Player> players;
}
错误日志
Field error in object 'team' on field 'players': rejected value [Player(name=vamshee, age=20, exp=1),Player(name=messi, age=32, exp=18),Player(name=ronaldo, age=34, exp=18)]; codes [typeMismatch.team.players,typeMismatch.players,typeMismatch.java.util.List,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [team.players,players]; arguments []; default message [players]]; default message [Failed to convert property value of type 'java.lang.String[]' to required type 'java.util.List' for property 'players'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'com.example.kkvamshee.Cricket.Player' for property 'players[0]': no matching editors or conversion strategy found]
在这个错误日志的末尾,“没有找到匹配的编辑器或转换策略”。
我尝试将th:valueType 更改为Integer,它成功地将相应的文本转换为整数值。但是我得到这个转换错误,例如对 Team 对象或任何其他自定义对象做同样的事情。
【问题讨论】:
标签: java html spring model-view-controller thymeleaf