Postgresql Scala+播放->类型不匹配;找到:anrom.RowParser必需:anrom.ResultSetParser[选项[models.User]]

Postgresql Scala+播放->类型不匹配;找到:anrom.RowParser必需:anrom.ResultSetParser[选项[models.User]],postgresql,scala,playframework,Postgresql,Scala,Playframework,解决方案:我无法计算如何返回[User]选项的不存在,因此在未找到用户的情况下,我创建了一个虚拟用户对象,控制器对其进行推理感觉很糟糕,但正在工作…: 来自Application.scala val loginForm = Form( tuple( "email" -> text, "password" -> text ) verifying ("Invalid email or password", result => result match { case (e

解决方案:我无法计算如何返回[User]选项的不存在,因此在未找到用户的情况下,我创建了一个虚拟用户对象,控制器对其进行推理感觉很糟糕,但正在工作…: 来自Application.scala

val loginForm = Form(
tuple(
  "email" -> text,
  "password" -> text
) verifying ("Invalid email or password", result => result match {
  case (email, password)  => (User.authenticate(email, password).map{_.id}.getOrElse(0) != 0)
})

与之相反:

val loginForm = Form(
  tuple(
  "email" -> text,
  "password" -> text
) verifying ("Invalid email or password", result => result match {
  case (email, password) => User.authenticate(email, password).isDefined
})

++++++++++++++++++原件2++++++++++++++++++ 谢谢你的建议!我已经做了一些更改,似乎越来越接近了,但是我不知道如何返回未定义的选项[user]。我还尝试了case=>null,请参见以下内容:

来自User.scala

case class User(id: Int, email: String, name: String, password: String)

object User {

  // -- Parsers

  /**
   * Parse a User from a ResultSet
   */
  val userParser = {
            get[Option[Int]]("uid")~        
            get[Option[String]]("email")~
            get[Option[String]]("fname")~
            get[Option[String]]("pbkval") map {
            case (uid~email~name~pbkval) => validate(uid,email, name, pbkval)
            }
  }

  /**
   * Retrieve a User from email.
   */
  def findByEmail(email: String): Option[User] = {
    DB.withConnection { implicit connection =>
      SQL("select * from get_pbkval({email})").on(
                'email -> email         
            ).as(userParser.singleOpt)
    }
  }


  /**
   * Authenticated user session start.
   */
  def authenticate(email: String, password: String): Option[User] = {
    DB.withConnection { implicit connection =>
      SQL(
            """
                        select * from get_pbkval({email})
            """
            ).on(
                'email -> email
            ).as(userParser.singleOpt)

        }
    }

  /**
   * Validate entry and create user object.
   */
    def validate(uid: Option[Int], email: Option[String], fname: Option[String], pbkval: Option[String]): User = {
                val uidInt : Int = uid.getOrElse(0)
                val emailString: String = email.getOrElse(null)
                val fnameString: String = fname.getOrElse(null)
                val pbkvalString: String = pbkval.getOrElse(null)
                User(uidInt, emailString, fnameString, pbkvalString)
    }

我想很明显,我并没有真正得到一些基本的东西。。我已经通读了好几个小时了。。任何帮助都将不胜感激

您没有指定要映射的行。在行映射器之后,放置*以表示要映射的行。当您使用它时,我发现在单独的val中定义行映射器更容易。类似这样的东西

val user={ 获取[Option[Int]]uid~ 获取[选项[字符串]]电子邮件~ 获取[Option[String]]fname~ 获取[Option[String]]pbkval映射{ 案例uid~email~name~password=>validateuid,email,name,password } } def AuthenticateMail:String,密码:String:Option[用户]={ DB.withConnection{隐式连接=> SQL 从get_pbkval{email}中选择* 在…上 '电子邮件->电子邮件 阿瑟先生* } } def validateuid:Option[Int],email:Option[String],fname:Option[String],pbkval:Option[String]:Option[User]={ 如果uid!=无{ val uidInt:Int=uid.getOrElse0 val emailString:String=email.getOrElsenull val fnameString:String=fname.GetOrelsNull val pbkvalString:String=pbkval.getOrElsenull UseruidInt、emailString、fnameString、pbkvalString }else{return null} }
注意as方法现在有两个参数,您的行映射器现在被定义为val用户,和一个*表示您要映射所有行。

感谢您的回复Ben,我已经做了您建议的更改,感觉更接近了-我现在遇到了这个错误:类型不匹配;找到:anrom.ResultSetParser[List[Option[models.User]]]必需:anrom.ResultSetParser[Option[models.User]]*表示您正在返回一组用户,因此您可能需要修改返回类型。否则,您将使用user.singleOpt,但WHERE子句可能位于某种唯一标识符上。我会编辑答案,但不能保证它会在不启动项目的情况下编译,我没有时间去做-