我正在阅读这本书Learn Java for Web Development并试图从书中执行代码示例。
我遇到Play Framework代码示例(第8章)的问题。
例外:
“views.html.index中的render(java.util.List,play.data.Form)无法应用于(java.lang.String)”
控制器类:
final static Form<Book> bookForm = Form.form(Book.class);
public static Result books(){
return ok(views.html.index.render(Book.all(),bookForm));
}
查看 - index.scala.html
@(books: List[Book], bookForm: Form[Book])
@import helper._
@main("books") {
<h1>@books.size() book(s)</h1>
<ul>
@for(book <- books) {
<li>
@book.label
@form(routes.Application.deleteBook(book.id)) {
<input type="submit" value="Delete">
}
</li>
}
</ul>
<h2>Add a new book</h2>
@form(routes.Application.newBook()) {
@inputText(bookForm("label"))
<input type="submit" value="Create">
}
}
修改:
1)我刚刚在Windows 8机器上从头开始安装了最新的播放版本,目前它是Play 2.3.1。我没有对Play框架进行任何修改。这是我的第一个游戏项目
2)完整错误(在Eclipse中):The method render(String) in the type index is not applicable for the arguments (List<Book>, Form<Book>)
3)当我尝试刷新浏览器时,代码已编译,我可以在屏幕上看到Book表单
答案 0 :(得分:3)
即使您的计算机上安装了Play 2.3.1,此特定项目也会在project/plugins.sbt
文件的此行中引用Play 2.2.0:
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.2.0")
所以它使用Play 2.2.0,它将由sbt
下载,而不是您机器中其他地方安装的Play版本。
除了错误消息之外,Eclipse还会显示文件名和行号。如果单击错误消息,它应该打开该文件。在该项目中,它可能是test/ApplicationTest.java
文件,其中包含以下行:
Content html = views.html.index.render("Your new application is ready.");
这是默认新应用程序模板的一部分,它应该被修改。此特定行无法编译,因为index
视图需要作为参数List<Book>, Form<Book>
而不是String
。这在views/index.scala.html
文件的这一行中说明:
@(books: List[Book], bookForm: Form[Book])
对于此示例项目,解决方案是删除文件test/ApplicationTest.java
,因为它没有真正添加值,因为此测试不适用于此项目。在生产项目中,应该更新此文件,以便编译并通过测试。
尽管出现此错误,项目仍会运行,因为该代码仅针对test
目标执行。但是Eclipse会显示所有目标的错误。