playframework scala返回发布请求

时间:2017-08-01 06:50:05

标签: scala playframework

在我的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))
        }

    })
  }

但是我收到了这个错误:

enter image description here

enter image description here

可能是我的问题?

新错误 enter image description here

2 个答案:

答案 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,这将使您的def同步(不建议使用)
  • 保留.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