播放FormFactory类型不匹配

时间:2018-11-10 12:35:46

标签: scala playframework

我在Scala和Play上苦苦挣扎。我的模型中有这本书课

class Book(identifier: Int, title1: String, price1: Int, author1: String) {

  val id: Int = identifier
  val title: String = title1
  var price: Int = price1
  val author: String = author1

  override def toString: String = s" $title written by $author"
}

在我的BooksController类中,我正在定义基本CRUD操作。我想使用我要注入的FormFactory类做一些魔术。

import javax.inject._
import play.api.mvc._
import model.Book
import model.BookSet
import play.data._
import scala.collection.mutable.HashMap


@Singleton
class BooksController @Inject()(cc: ControllerComponents, formFactory: FormFactory)  (implicit assetsFinder: AssetsFinder)
    extends AbstractController(cc) {

  //show a form
  def create = {
    val bookform: Form[Book] = formFactory.form(classOf[Book])
    Ok(views.html.bookstore.create(bookform))

  }

  //show all books
  def index = Action {
    val map: HashMap[Int, Book] = BookSet.bookMap
    Ok(views.html.bookstore.bookindex(map))
  }

这是我的书店。创建scala.html文件

@import model.Book
@import helper._

@(bookForm: Form[Book])

<html>
    <head>
        <title>Create Book </title>
    </head>
    <body>
        <h1> Create Book</h1>
        @helper.form( action = routes.BooksController.save() ){
            @helper.inputText(bookForm("id"))
            @helper.inputText(bookForm("title"))
            @helper.inputText(bookForm("price"))
            @helper.inputText(bookForm("author"))

            <input type="submit" value="Create Book">

        }
    </body>

</html>

这些是麻烦的代码行:

val bookform: Form[Book] = formFactory.form(classOf[Book])
Ok(views.html.bookstore.create(bookform))

在第二行,IntelliJ通知我 类型不匹配,预期play.api.data.Form [model.Book],实际play.data.Form [model.Book]

我尝试通过在html中添加以下行来解决此问题,但会导致错误(可能是由辅助类引起的)

@import play.data.Form

我还尝试过使用asInstanceOf []从工厂传递play.api.data.Form:

val bookform: Form[Book] = formFactory.form(classOf[Book])

Ok(views.html.bookstore.create(bookform.asInstanceOf[play.api.data.Form[Book]]))

尝试此操作后,在编译过程中出现错误: 找不到隐式的MessagesProvider实例。 P 租借请参阅https://www.playframework.com/documentation/2.6.x/ScalaForms#Passing-MessagesProvider-to-Form-Helpers [错误] @ helper.inputText(bookForm(“ title”))

基本上每个字段都重复一次。因此,我遵循了scala docs Option 2,并向控制器添加了注入和隐式请求以及对html文件的隐式请求。仍然出现相同的错误

在这一点上,我感到无助,这就是为什么我要问这个问题。 可以将play.data.FormFactory与助手类一起使用吗?不幸的是play.api.data包没有提供它自己的FormFactory。我觉得有一个显而易见的解决方案,我只是想念。 谢谢您的耐心

1 个答案:

答案 0 :(得分:0)

我认为乍看之下,FormFactory从未用于Scala,而仅用于Java。我对此可能是错的,但是我从未在Scala中使用过它。

如果您愿意尝试以下操作,则可能会更轻松:

只需将您的Book更改为:

case class Book(identifier: Int, title: String, price: Int, author: String)

创建一个如下所示的表单:

val bookForm = Form(
   mapping(
     "id" -> number,
     "title" -> nonEmptyText,
     "price" -> number,
     "author" -> nonEmptyText
   )(Book.apply)(Book.unapply)
 )

然后您的Controller可能类似于以下内容:

@Singleton
class BooksController @Inject()(cc: ControllerComponents)  
  (implicit assetsFinder: AssetsFinder)
  extends AbstractController(cc) {

  //show a form
  def create = {
    Ok(views.html.bookstore.create(bookForm))
  }

  //show all books
  def index = Action {
     val map: HashMap[Int, Book] = BookSet.bookMap
     Ok(views.html.bookstore.bookindex(map))
  }
}

不确定AssetsFinder,但是您可能有原因,因此我在示例中将其保留。 ;)