在我的scala playframework应用程序中,我想返回via post提交,然后将光滑的存储对象返回到前端作为json
我试过了:
def createClient = Action.async { implicit request =>
request.body.asJson.map(_.validate[ClientModel] match {
case JsSuccess(client) =>
clientDTO.createClient(client).map { clients =>
Ok(Json.toJson(clients))
}
})
}
但是我收到了这个错误:
可能是我的问题?
答案 0 :(得分:2)
尝试沿着以下方面的事情:
def createClient = Action.async { implicit request =>
request.body.asJson match {
case None => // do something that returns a Future[Result] ~ such as NotFound or
case Some(js) =>
js.validate[ClientModel] match {
case client: JsSuccess[ClientModel] =>
clientDTO.createClient(client).map { clients =>
Ok(Json.toJson(clients))
}
case e: JsError => // do something that returns a Future[Result] ~ such as InternalServerError
}
}
}
答案 1 :(得分:-1)
.async,顾名思义,需要使用Future类型。 您有2个选择:
保留.async,但返回Future结果
def createClient = Action.async { implicit request =>
request.body.asJson.map(_.validate[ClientModel] match {
case JsSuccess(client) =>
clientDTO.createClient(client).map { clients =>
Future(Ok(Json.toJson(clients)))
}
})
}
但是您仍然需要添加验证错误的情况:
case JsSuccess(client) =>
{
clientDTO.createClient(client).map
{
clients => Future(Ok(Json.toJson(clients)))
}
}
case _ => Future(BadRequest(""))
这应该工作,并且在除JsSuccess之外的所有情况下,该函数都将返回将来的BadRequest响应。 更好的解决方案是使用JsError更改_:
case e: JsError =>
{
Println(e)
Future(BadRequest(.....))
}
这还将打印错误。
您可以在此处了解更多信息:https://www.playframework.com/documentation/2.6.x/ScalaJson (使用验证章节)
有关scala中未来的更多信息:https://docs.scala-lang.org/overviews/core/futures.html