这是我第一次接触百里香,遇到一个奇怪的问题,我似乎无法解决。最小样本:
考虑以下Controller映射以列出数据库中的所有用户:
@GetMapping("/users")
public String listUsers(Model model) {
model.addAttribute("users", userRepository.findAll());
return "users";
}
在用户视图内,我想列出用户,并为每个用户添加一个按钮,以获取该特定用户的详细信息:
<table>
<thead>
<tr><th>Name</th></tr>
</thead>
<tbody>
<form th:each="user : ${users} th:action="@{/user}" th:object="${user}" method="post">
<tr>
<td th:text="${user.getUserName()}">Name</td>
<td><input type="submit" value="Details" /></td>
</tr>
</form>
</tbody>
</table>
因此,由于用户是一个列表,所以我最初的想法是为该列表中的每个用户创建一个表单,然后将当前的$ {user}绑定到th:object。然后在控制器映射中获取详细信息(因为与此同时可能已更改):
@PostMapping("/user")
public String userDetails(@ModelAttribute User user, Model model) {
model.addAttribute("user", userService.findUserById(user.getId()));
return "userDetails";
}
现在我的问题是它不起作用。控制器中的ModelAttribute为null。我一直在阅读thymeleaf的表单文档,但无法弄清楚为什么如果不将隐藏字段中的所有用户属性添加到表单中就无法从当前迭代中发布用户。我可能会尝试做一些完全疯狂的事情,但是我不诚实地……对我有什么提示吗? :)
@更新: 经过无数次重写之后,我解决了以下问题:
@GetMapping("/users/{id}/details")
public String user(@RequestParam Integer userId, Model model) {
model.addAttribute("user", userService.findUserById(userId));
return "userDetails";
}
意思是我只想获取用户的ID。为此,我创建了以下模板:
<form th:each="user: ${users}" th:action="@{/users/{user_id}/details(user_id=${user.id}})}" method="post">
<tr>
<td th:text="${user.userName}">Name</td>
<td><input type="submit" value="Details" /></td>
</tr>
</form>
现在,这将导致
由以下原因引起:org.thymeleaf.exceptions.TemplateProcessingException:可能 不解析为表达式: “ @ {/用户/ {user_id} / details(user_id = $ {user.id}})}”“(模板:“用户” -第13行,第44行)
我还尝试了使用带隐藏文本字段的id的旧post方法,并在控制器中使用了th:object =“ $ {user.id}”,它为null。我在用户上保留了th:object,而在user.id上保留了唯一的隐藏字段,但是在控制器中User is null id字段未设置。如果我尝试对任何事物使用th:field,我都会再次遇到百里香例外:
由以下原因引起:org.attoparser.ParseException:执行期间出错 处理器 'org.thymeleaf.spring5.processor.SpringInputGeneralFieldTagProcessor' (模板:“用户”-第16行,第44列)
在那里,我对每个Web开发人员的最深切敬意。我一直讨厌与Web开发相关的任何事情,说实话,这甚至不希望我开始喜欢它。这简直是疯狂:)