java - 正确发送对象
问题描述
解决方案
根据百里香文档,
表单标记中 th:object 属性的值必须是变量表达式 (${...}),仅指定模型属性的名称,而无需属性导航。这意味着像 ${seedStarter} 这样的表达式是有效的,但 ${seedStarter.data} 不是。
您的 Thymeleaf 表单呈现所选作者的 toString 值。无法在选项列表中绑定作者对象。因此,更改 Book 对象添加一个新属性authorId(如果 Book 是 JPA 实体,请使用 @Transient 对其进行注释)。
@Component
public class Book {
private String isbn;
private String title;
private Author author;
// New Transient attribute to bind authorId from select component
private String authorId;
}
现在,可以使用 select 组件绑定这个新属性,因为它符合上述文档。
<form action="#" th:action="@{/books}" th:object="${book}" method="post">
...
<select th:field="*{authorId}">
<option th:each="author : ${authors}"
th:value="${author.id}"
th:text="${author.name}"/>
</select>
...
在您的控制器中,您可以使用 book.authorId 获取作者对象并将其设置为 book 对象。
@PostMapping("/books")
public RedirectView create(Book book) {
Author author = authorService.findById(book.authorId);
book.setAuthor(author);
bookService.create(book);
return new RedirectView("/books.html?isbn=" + book.getIsbn());
}
推荐阅读
- javascript - 为什么那个错误是 Uncaught TypeError: Cannot set property 'onclick' of null in my modal?
- python - 如何在 Python 请求中使用现有的 cookie 文件?
- c++ - 在 foreach 循环中将变量声明为 i vs &i
- keras - 如何在每个时期从同一点开始,以及何时在 Keras 拟合函数中使用和不使用 dataset.repeat()?
- reactjs - 为什么使用 useField() 时自定义输入验证和 setError() 不起作用?
- node.js - 如果集合不存在,则在 mongodb 节点 js 中创建否则更新
- arrays - C中选择排序的修改版本
- c# - Expression.Like 替代基于 c# 中的文本进行过滤
- reactjs - 我如何模拟我的日期,以便它也可以在部署服务器上工作
- django - 无法插入数据,Django 主键没有默认值