Statt as[T]
Verwendung validate[T]
, die Sie ein JsResult[T]
gibt. Es wird in der Play-Dokumentation here erklärt.
Von dort können Sie fold
es und elegant das Problem behandeln. In der Regel möchte ich eine Zusammenfassung des Problems an den Anrufer als JSON senden, die viel besser ist als die "500 - Interner Serverfehler" HTML-Seite, die Sie erhalten, wenn Sie as[T]
verwenden. Zumindest durch die Rückgabe eines 4xx
Code anstelle einer 500
, setzt es die Schuld auf die Aufrufer - es war sie, die uns ungültige JSON doch schickte!
Beispiel:
/**
* You can use this method as the error
* handler wherever you fold on a validate[T]
*/
def handleBadJson(problems:Seq[(JsPath, Seq[ValidationError])]):Future[Result] = {
val jsProblems = problems.map { case(path, errs) =>
val jsErrs = errs.map(err => JsString(err.message))
path.toString -> JsArray(jsErrs)
}
Future.successful(BadRequest(JsObject(jsProblems)))
}
def doSomethingWithJsonRequest = Action.async(parse.json) { request =>
request.body.validate[Foo].fold(handleBadJson, goodFoo => {
...
})
}