如何改进从Play框架2.x中的JsError.toFlatJson或JsError.toJson返回的错误消息可读性?

nul*_*ull 9 json scala playframework playframework-2.0

我有一个使用scala构建的带有Play框架v2.3的JSON REST API服务器,我有这样的控制器动作,例如:

  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...
          }
      )
    }
Run Code Online (Sandbox Code Playgroud)

为简单起见,我处理了验证错误JsError.toFlatJson(注意:JsError.toFlatJson在较新的Play中不推荐使用,替换是JsError.toJson).

问题是json结果有如下隐秘的消息:

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

以上json表示该人的电子邮件无效.

有没有办法将错误json结果转换为更可读的消息?

我不希望客户端应用程序应该做的映射/转换obj.person.emailerror.email.我更喜欢服务器在将json返回到客户端应用程序之前执行此操作.

Gav*_*ulz 1

您的部分问题可以通过在您的类Reads组合器中定义自定义错误消息来解决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 _)
}
Run Code Online (Sandbox Code Playgroud)

给定此类的一些无效 JSON,您现在将收到有关验证问题的自定义错误消息:

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":[]}]}
Run Code Online (Sandbox Code Playgroud)

为了更改obj.x标识符,您必须自己对返回的 JsValue 进行后处理,因为它源自JsPath.