Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何在PlayFramework中检查给定字段是否为字母数字_Scala_Playframework_Playframework 2.5_Playframework Json - Fatal编程技术网

Scala 如何在PlayFramework中检查给定字段是否为字母数字

Scala 如何在PlayFramework中检查给定字段是否为字母数字,scala,playframework,playframework-2.5,playframework-json,Scala,Playframework,Playframework 2.5,Playframework Json,我必须检查密码字段是否为字母数字,如果不是,它将抛出自定义验证错误我正在使用play framework,但得到编译时错误 value checkAlphanumeric is not a member of play.api.libs.json.Reads[String] - value checkAlphanumeric is not a member of play.api.libs.json.Reads[String] 我无法达到我想要的结果我做错了这就

我必须检查密码字段是否为字母数字,如果不是,它将抛出自定义验证错误我正在使用play framework,但得到编译时错误

value checkAlphanumeric is not a member of 
     play.api.libs.json.Reads[String]
    - value checkAlphanumeric is not a member of 
     play.api.libs.json.Reads[String]
我无法达到我想要的结果我做错了这就是为什么我需要这里的代码

case class userUserSignUpValidation(firstName: String,
                                      lastName: String,
                                      email: String,
                                      password: String) extends Serializable

object UserSignUpValidation {
  val allNumbers = """\d*""".r
  val allLetters = """[A-Za-z]*""".r
  var validationErrorMsg=""
  implicit val readDirectUser: Reads[DirectUserSignUpValidation] = (
    (JsPath \ "firstName").read(minLength[String](1)) and
    (JsPath \ "lastName").read(minLength[String](1)) and
    (JsPath \ "email").read(email) and
    (JsPath \ "password").read(minLength[String](8)checkAlphanumeric))(UserSignUpValidation.apply _)
    def checkAlphanumeric(password:String)={
        val allNumbers = """\d*""".r
        val allLetters = """[A-Za-z]*""".r

        val errors = password match {
          case allNumbers() => Seq(ValidationError("Password is all numbers"))
          case allLetters() => Seq(ValidationError("Password is all letters"))
          case _ => Nil
        }
     }
我在这条线上发现了错误

(JsPath \ "password").read(minLength[String](8)checkAlphanumeric))(UserSignUpValidation.apply _)

实现上述场景的正确方法是什么?我想知道为什么不在case类中运行验证

case class userUserSignUpValidation(firstName: String,
                                      lastName: String,
                                      email: String,
                                      password: String) {

   assert(!password.matches("""[A-Za-z]*""") && !password.matches("""\d*"""), "Invalid password")
   // have other field validations here
}
在您的UserSignUpValidation中,使用隐式格式化程序,如下所示:

object UserSignUpValidation {
   implicit val userFormatter = JSON.format[userUserSignUpValidation]

    // de-serialization code here
}

您的问题是无法以这种方式使用
checkAlphanumeric
方法。您可能需要的是
上的一个过滤器读取
,因此我建议执行以下操作(我使用预先存在的方法更改了检查的实现):

implicit val readDirectUser: Reads[DirectUserSignUpValidation] = (
  (JsPath \ "firstName").read(minLength[String](1)) and
    (JsPath \ "lastName").read(minLength[String](1)) and
    (JsPath \ "email").read(email) and
    (JsPath \ "password").read(minLength[String](8).
      filterNot(ValidationError("Password is all numbers"))(_.forall(_.isDigit)).
      filterNot(ValidationError("Password is all letters"))(_.forall(_.isLetter))
    )) (UserSignUpValidation.apply _)