2017-03-17 1 views
0

Ich möchte ein Passwort-Feld validieren, wie folgt:ist es möglich, zwei Validierungsmethoden zur Ausführung von Reads auf demselben JsPath

Überprüfen Sie zunächst, dass das Passwort nur Kleinbuchstaben hat Dann überprüfen, ob seine Länge min 8 Zeichen ist.

Ich habe die zwei Validierungscodes wie folgt geschrieben:

/*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) 
    }) 
} 

ich den Code wie folgt aufgerufen bekam aber Kompilierungsfehler Cannot prove that String <:< String => C.

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

ich versucht, mit Reads.minLength (8) aber bekam ein anderer Fehler.

Konnte ich nicht zwei Bestätigungscodes hintereinander verwenden? entweder

Antwort

0

können Sie verwenden die keepAndoderandKeepvalidators dies zu tun. Diese combinators werden beide Reads laufen, aber nur halten die erfolgreich Ergebnis entweder den linken oder rechten Operanden:

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()))))) 
+0

funktionierte nicht, leider. Erhielt eine divergierende implizite Erweiterung für den Typ play.api.libs.json.Reads [M], beginnend mit der Methode ArrayReads im Merkmal DefaultReads, wenn ich keepAnd oder keepAnd verwendete. '(JsPath \" user "\" password "). Read [String] ((checkPasswordCase) undKeep (Reads.minLength (8))) und ...' –

+0

Dies könnte durch den redundanten '[T]' in verursacht werden Ihre Definition von 'checkPasswordCase' und' checkPasswordLength'. Diese Validatoren behandeln nur Strings, sind also nicht generisch. Versuchen Sie, nur das '[T]' zu entfernen. Alternativ können Sie den Typ explizit mit 'checkPasswordCase [String]' angeben. – Mikesname

+0

[T] aus den Definitionen von checkPasswordCase und checkPasswordLength entfernt. Dann '(JsPath \" user "\" password "). Lese [String] ((checkPasswordCase) und Keep (checkPasswordLength (8))) und funktioniert. Vielen Dank. –

Verwandte Themen