在Play中将案例类转换为案例类

时间:2017-09-25 01:15:31

标签: playframework playframework-2.0

我有一个播放控制器REST端点,它将我想要的json转换为POST中的以下案例类     case class MyData(id:Name,role:String)

我在source code做了一些阅读 我仍然不清楚如何使用语法将Action.async(??) {?? } 有效负载转换为我的类。 我正在尝试以下几行,但它没有编译

*-androidTest.apk

3 个答案:

答案 0 :(得分:0)

你不能只为自己想要的任何课程建立一个身体,它不会那样工作。如果您希望正文返回A类,则需要关注https://www.playframework.com/documentation/2.6.x/ScalaBodyParsers#writing-a-custom-body-parser

这是一个将流转换为A的解析器。但这不是演员。

答案 1 :(得分:0)

你需要表格。 https://www.playframework.com/documentation/2.6.x/ScalaForms 所以它会是这样的:

val form = Form(
  mapping(
    "id" -> text,
    "role" -> text
  )(MyData.apply)(MyData.unapply)
)

def action = Action.async { implicit request => 
form.bindFromRequest.fold(
  formWithErrors => {
    BadRequest("Error")
  },
  data => {
    //data is your case class mapped
    Ok("Success." + data.id + " " + data.role)
  }
)
}

答案 2 :(得分:0)

这可以帮到你:

class MyController @Inject()(cc: ControllerComponents)
                            (implicit val ec: ExecutionContext) extends AbstractController(cc){

   def foo() = Action.async(cc.parsers.json) { implicit request =>
    request.body.validate[MyData].fold(
      errors => errorsToFutureResult(errors),
      myData => 
        //do staff with you data
        Ok(""))
    )
  }
}

这是你的案例类定义:

case class MyData(id:Name, role:String)
object MyData{
   implicit val myDataFormat: Format[MyData] = (
    (JsPath \ "id").format[Name] and
      (JsPath \ "role").format[String]
    ) (MyData.apply, unlift(MyData.unapply))
}