是否可以在同一个JsPath上执行两个Reads验证方法

时间:2017-03-17 09:31:25

标签: json playframework

我想验证密码字段,如下所示:

首先检查密码是否只有小写 然后检查它的长度是否为最少8个字符。

我写了两个验证码如下:

/*check lowercase*/

def checkPasswordCase[T]: Reads[String] = {
  Reads.StringReads.filter(ValidationError("Password not in lowercase"))(str => {
    (str.matches("""[a-z]+"""))
  })
}


/*check length*/
def checkPasswordLength[T](min:Int): Reads[String] = {
  Reads.StringReads.filter(ValidationError("Invalid password length"))(str => {
    (str.length >= min)
  })
}

我按如下方式调用了代码,但编译错误Cannot prove that String <:< String => C.

(JsPath \ "user" \ "password").read[String](checkPasswordCase)(checkPasswordLength(8)) and ...

我尝试使用Reads.minLength(8)但出现了不同的错误。

我不能连续使用两个验证码吗?

1 个答案:

答案 0 :(得分:0)

您可以使用keepAnd andKeep validators来执行此操作。这些组合器将同时运行Reads,但只保留左或右操作数的成功结果:

val r = (JsPath \ "user" \ "password").read[String](
  checkPasswordCase keepAnd checkPasswordLength(8))

val js = Json.obj("user" -> Json.obj("password" -> "FOO"))
println(js.validate[String](r))
// JsError(List((/user/password,List(
//          ValidationError(List(Password not in lowercase),WrappedArray()), 
//          ValidationError(List(Invalid password length),WrappedArray())))))