2015-03-25 8 views
6

Ho un server API JSON REST costruito con v2.3 Gioca quadro con scala, e non ho l'azione di controllo in questo modo, per esempio:Come migliorare la leggibilità dei messaggi di errore restituita da JsError.toFlatJson o JsError.toJson in Play framework 2.x?

def register = Action.async(BodyParsers.parse.json) { implicit request => 
     request.body.validate[Register].fold(
     errors => Future.successful(BadRequest(JsError.toFlatJson(errors))), 
     register => { 
      // do something here if no error... 
      } 
    ) 
    } 

Per semplicità, ho gestire l'errore di convalida con JsError.toFlatJson (nota: JsError.toFlatJson è deprecato in Play più recente, la sostituzione è JsError.toJson).

Il problema è il risultato JSON hanno messaggio criptico come:

{"obj.person.email":[{"msg":"error.email","args":[]}]}

Sopra JSON indica e-mail della persona non è valido.

C'è un modo per convertire il risultato dell'errore json in un messaggio più leggibile?

Non voglio che le app client facciano la mappatura/conversione dello obj.person.email o error.email. Preferisco che il server lo faccia prima di restituire il json alle app del client.

risposta

0

Parte del problema può essere risolto attraverso la definizione di messaggi di errore personalizzati nella classe Reads combinatore con orElse:

case Point(x: Int, y: Int) 

object Point { 
    implicit val pointReads: Reads[Point] = (
     (__ \ "x").read[Int].orElse(Reads(_ => JsError("Could not parse given x value."))) 
     (__ \ "y").read[Int].orElse(Reads(_ => JsError("Could not parse given y value."))) 
    )(Point.apply _) 
} 

Dato un valido JSON per questa classe si ora ottenere messaggi di errore personalizzati per problemi di convalida :

scala> val incorrectJson = Json.parse("""{"y": 1}""") 
incorrectJson: play.api.libs.json.JsValue = {"y":1} 

scala> val validationResult = incorrectJson.validate[Point] 
validationResult: play.api.libs.json.JsResult[playground.Point] = JsError(List((/x,List(ValidationError(List(Could not read the point's x value.),WrappedArray()))))) 

scala> validationResult.fold(error => { println(JsError.toJson(error)) }, a => { a }) 
{"obj.x":[{"msg":["Could not read the point's x value."],"args":[]}]} 

al fine di modificare l'identificatore obj.x dovrete post-processo restituita JsValue da soli perché è derivato dalla realizzazione di JsPath .

Problemi correlati