1 回答

TA贡献1872条经验 获得超3个赞
根据百里香酚文献,
表单标记中 th:object 属性的值必须是变量表达式 (${...}),仅指定模型属性的名称,而不指定属性导航。这意味着像 ${seedStarter} 这样的表达式是有效的,但 ${seedStarter.data} 不是。
您的 Thymeleaf 表单将呈现为所选作者的字符串值。无法在选项列表中绑定 Author 对象。因此,更改 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());
}
添加回答
举报