【问题标题】:Play FormFactory Type Mismatch播放 FormFactory 类型不匹配
【发布时间】:2018-11-11 02:36:18
【问题描述】:

我在 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))
  }

这是我的 bookstore.create 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 实例。磷 租见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。我觉得我只是缺少一个明显的解决方案。 感谢耐心

【问题讨论】:

    标签: scala playframework


    【解决方案1】:

    我认为乍一看,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,但你可能有原因,所以我把它留在了例子中。 ;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      相关资源
      最近更新 更多