我有一个控制器,可以访问数据库并获取一系列书籍。我喜欢使用@modelAttribute以单独的形式显示各个书籍,因此我可以对每个项目进行快速编辑。
控制器
<h3>Book Inventory</h3>
<table>
<tr>
<td>ID</td>
<td>Book Name</td>
<td>ISPN</td>
<td>Price</td>
<td></br><td>
<td>Object</td>
</tr>
<!-- Each book in separate form for easy update -->
<c:forEach var="book" items="${books}">
<tr>
<sf:form class="editeForm" action="${pageContext.request.contextPath}/edititem" modelAttribute="book" method="POST">
<td>${book.id} <input type="hidden" path="id" name="id"></td>
<td><sf:input type="text" path="name" name="name" /></td>
<td><sf:input type="text" path="ispn" name="ispn" /></td>
<td><sf:input type="text" path="price" name="price" /></td>
<td></br><td>
<td>${book}</td>
<td><input type="submit" value="save edite"><input type="submit" name="delete" value="delete"></td>
</sf:form>
</tr>
</c:forEach>
</table>
查看
Caused by: java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'book' available as request attribute
at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:144)
当我设置modelAttribute =&#34; book&#34;堆栈跟踪是
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'Book bean [id=1, name=Java: A Beginner's Guide, ispn=978-0071809252, price=18' available as request attribute
的ModelAttribute =&#34; $ {书}&#34;堆栈跟踪是
<h3>Book Inventory</h3>
<table>
<tr>
<td>ID</td>
<td>Book Name</td>
<td>ISPN</td>
<td>Price</td>
<td></br><td>
<td>Object</td>
</tr>
<!-- Each book in separate form for easy update -->
<c:forEach var="book" items="${books}">
<tr>
<form class="editeForm" action="${pageContext.request.contextPath}/edititem" method="POST">
<td>${book.id} <input type="hidden" name="id" value="${book.id}"/></td>
<td><input type="text" name="name" value="${book.name} /></td>
<td><input type="text" name="ispn" value="${book.ispn} /></td>
<td><input type="text" name="price" value="${book.price} /></td>
<td></br><td>
<td>${book}</td>
<td><input type="submit" value="save edite"><input type="submit" name="delete" value="delete"></td>
</form>
</tr>
</c:forEach>
</table>
更新:如果我使用普通的JSTL它可以工作,但无论如何使用modelAttriburte?
D
答案 0 :(得分:1)
当你写:
<c:forEach var="book" items="${books}">
确实为每次迭代创建了book
变量,但它只是一个页面作用域变量而不是一个请求属性。正如错误所说,Spring modelAttribute应该是请求属性。我知道动态地使book
变量成为真正的弹簧模型属性并不是一种简单的方法,我的建议是坚持使用普通的JSTL。
由于JSTLView默认情况下仅将模型属性作为请求属性与其名称一起使用,因此您可以使用一个小脚本来试图欺骗spring:
<c:forEach var="book" items="${books}">
<%
Object obj = pageContext.findAttribute("book");
request.setAttribute("book", obj);
%>
...
但我真的敦促你不这样做,因为它依赖于Spring实现细节,即使在次要版本中也可以改变
答案 1 :(得分:0)
您使用<c:forEach var="result" items="${books}" varStatus="status">
和${result.id}
。你有机会检查控制器吗?你的书。