为什么项目yield case class apply/unapply methods编译错误?

Why does the project yield case class apply/unapply methods compilation error?

在我的 Play Scala 项目中,我想将值插入到我的数据库中。为此,我将表单字段映射到 Controller class 但在 Controller class 中它显示 apply/unapply 方法是 not a member of object controllers.

controllers/User.scala

package controllers

import play.api.mvc._
import play.api.data._
import play.api.data.Forms._
import views._
import models._

object User extends Controller {

    val userForm = Form(
    mapping(   
      "username" -> nonEmptyText,
      "emailid" -> text,
      "password" -> nonEmptyText    
      )(User.apply)(User.unapply)
  )


}

models/User.scala

package models

import play.api.db._
import anorm._
import anorm.SqlParser._
import play.api.Play.current
import scala.language.postfixOps

case class User ( 
  username: String,
  emailid: String,
  password: String

)

object User {


 val simple = { 
    get[String]("user.USER_NAME") ~
    get[String]("user.EMAIL_ID") ~
    get[String]("user.PASSWORD")  map {

      case username~emailid~password => 
        User(username, emailid, password)
    }
  }




}

如果我 运行 activator compile 命令显示在下面 Exception

[error] D:\Test\app\controllers\User.scala:29: value a
pply is not a member of object controllers.User
[error]     )(User.apply)(User.unapply)
[error]            ^
[error] D:\Test\app\controllers\User.scala:29: value u
napply is not a member of object controllers.User
[error]     )(User.apply)(User.unapply)
[error]                        ^
[error] two errors found
[error] (compile:compileIncremental) Compilation failed
[error] Total time: 25 s, completed Jun 3, 2015 5:44:05 PM

这是因为,即使它们在不同的包中,您的控制器和您的模型共享相同的名称,User

您必须通过指定包(例如 (models.User.apply))来消除歧义,正如 Mon Calamari 在评论中指出的那样。

但更重要的是,您应该将控制器重命名为 Users 以避免歧义。在Play Framework中,约定是将控制器名称复数化。