我正在尝试让 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
?还是我需要自己写这个?