我是Thymeleaf的新手,并且遇到了一个奇怪的问题。让我告诉你首先起作用的是什么。我有两个简单的课程
public class Country {
private long countryid;
private String name;
}
和
public class Person {
private String name;
private long countryId;
}
在addPerson页面中,我想从下拉列表中选择国家。我已经手动创建了一个国家列表(通过spring控制器),然后将addPerson.html设计为
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>Add Person</h1>
<form action="#" th:action="@{/addPerson}" th:object="${person}"
method="POST">
<p>
Name: <input type="text" th:field="*{name}" />
</p>
<select th:field="*{countryId}" class="form-control">
<option th:each="country: ${countryList}"
th:value="${country.countryid}" th:text="${country.name}"></option>
</select>
<p>
<input type="submit" value="Submit" /> <input type="reset"
value="Reset" />
</p>
</form>
</body>
</html>
当我从下拉列表中选择一个国家/地区时,我会得到该国家/地区编号,并且一切正常。 现在,我想如下更改我的Person类
public class Person {
private String name;
private Country country;
}
因此,我想使用country对象本身而不是countryid。保持其他所有内容不变,我将addPerson.html更改为
<select th:field="*{country}" class="form-control">
<option th:each="country: ${countryList}"
th:value="${country}" th:text="${country.name}"></option>
</select>
现在我可以看到下拉列表,但是提交后,我得到了一个错误
发生意外错误(类型=错误请求,状态= 400)。 对object ='person'的验证失败。错误计数:1
简而言之:它可以与对象的属性一起使用,我需要做什么才能处理整个对象本身?
请帮助。
更新1:控制器方法签名
@GetMapping("/addPerson")
public String addPerson(Model model) {
Country country1 = new Country();
country1.setCountryid(1);
country1.setName("A");
Country country2 = new Country();
country2.setCountryid(2);
country2.setName("B");
List<Country> countryList = new ArrayList<Country>();
countryList.add(country1);
countryList.add(country1);
model.addAttribute("countryList", countryList);
model.addAttribute("person", new Person());
return "addPerson";
}
@PostMapping("/addPerson")
public void processAddPerson(@Valid @ModelAttribute("person") Person person) {
System.out.println(person.getName());
}
更新2
调试后,我发现在第二种情况下,在提交时,控件根本不会使用Person类的setCountry
方法!
答案 0 :(得分:0)
将BindingResult对象添加到您的方法。
public String processAddPerson( @Valid Person person,BindingResult bindingResult,Model model)
确保在BindingResult
注释的对象之后必须立即@Valid
。