0

我正在尝试让 Play 验证 + 将 json 请求正文转换为案例类。如果验证失败,我想发回人类可读的错误消息列表。

我的案例类是一个简单的登录请求:

case class LoginReq(user: String, password: String)

我想以简单的格式发送错误,例如:

{"errors": ["User was not provided", "Password was not provided"]}

这是我到目前为止实现的:

@Singleton
class LoginController @Inject()(cc: ControllerComponents) extends AbstractController(cc) {

    case class LoginReq(user: String, password: String)
    implicit val reqFormat = Json.format[LoginReq]


  def index() = Action(parse.json) { req =>

          val loginReq = req.body.validate[LoginReq]
          loginReq match {
              case JsSuccess(r: LoginReq, path: JsPath) => Ok(Json.toJson(r))
              case e: JsError =>
                  UnprocessableEntity(JsError.toJson(e))
          }
  }
}

问题是,这条线:

case e: JsError => UnprocessableEntity(JsError.toJson(e))

产生这种格式的错误:

{
    "obj.user": [
        {
            "msg": [
                "error.path.missing"
            ],
            "args": []
        }
    ],
    "obj.password": [
        {
            "msg": [
                "error.path.missing"
            ],
            "args": []
        }
    ]
}

而不是:

{"errors": ["User was not provided", "Password was not provided"]}

是否有我缺少的内置/简单方法将错误转换为更易于阅读的方式?至少转换error.path.missing成类似的东西was not provided?还是我需要自己写这个?

4

1 回答 1

0

沿着这些思路的东西应该工作......

[编辑]

def index = Action(parse.json) { request =>
    val loginResult = request.body.validate[LoginRequest]
    loginResult.fold(
      errors => {
        BadRequest(Json.obj("status" ->"KO", "message" -> errors.map {
          case x if x._1.path.nonEmpty ⇒ s"Invalid ${x._1.toString().stripPrefix("/")}"
        }))
      },
      login => {
        Ok(Json.obj("status" ->"OK", "message" -> s"Login successful as ${login.user}" ))
      }
    )
  }
于 2018-01-19T16:51:26.113 回答