0

unmarshalValueJs 関数を使用して引数を渡す createUser または updateUser はどうですか。

    package controllers.user

import play.api._
import play.api.mvc._
import play.api.libs.json._
import play.api.libs.json.Reads._
import play.api.libs.functional.syntax._
import services.user.UserServiceComponent
import domain.user.User

trait UserController extends Controller {
    self: UserServiceComponent =>0

def emailAlreadyExists(implicit reads: Reads[String]) =
    Reads[String](js => reads.reads(js).flatMap { e =>
      userService.tryFindByEmail(e).map(_ => JsError("error.custom.emailAlreadyExists")).getOrElse(JsSuccess(e))
    })

implicit val userReads = (__ \ "email").read[String](email andKeep emailAlreadyExists)
                                       .map(resource => UserResource(resource))

implicit val userWrites = new Writes[User] {
    override def writes(user: User): JsValue = {
        Json.obj(
            "id" -> user.id,
            "email" -> user.email
        )
    }
}

create User が unmarshalJsValue に渡すものは何ですか? リソースはどこから来るのですか?

def createUser = Action(parse.json) {request =>
    unmarshalJsValue(request) { resource: UserResource =>
        val user = User(Option.empty, resource.email)
        userService.createUser(user)
        Created
    }
}

def updateUser(id: Long) = Action(parse.json) {request =>
    unmarshalJsValue(request) { resource: UserResource =>
        val user = User(Option(id), resource.email)
        userService.updateUser(user)
        NoContent
    }
}

def findUserById(id: Long) = Action {
    val user = userService.tryFindById(id)
    if (user.isDefined) {
        Ok(Json.toJson(user))
    } else {
        NotFound
    }
}

def deleteUser(id: Long) = Action {
    userService.delete(id)
    NoContent
}

ここのRは何ですか?createUser には何が返されますか?

    def unmarshalJsValue[R](request: Request[JsValue])(block: R => Result)(implicit rds : Reads[R]): Result =
        request.body.validate[R](rds).fold(
            valid = block,
            invalid = e => {
                val error = e.mkString
                Logger.error(error)
                BadRequest(error)
            }
        )

}

case class UserResource(email: String)
4

1 に答える 1

1

R型変数です。定義は次のdef unmarshalJsValue[R](request: Request[JsValue])(block: R => Result)(implicit rds : Reads[R])とおりです。

  • 私は というメソッドですunmarshallJsValue

  • 潜在的に何かになる可能性のある型パラメーターが必要です。

  • の値が必要ですRequest[JsValue](おそらく JSON エンティティに含まれるリクエスト)。

  • type の値を指定するとR、 を生成する関数が必要ですResult

  • for typeimplicitであるスコープ内に値が必要です。言い換えれば、a を に変換する方法が必要です。(のドキュメントを見ると、その唯一のメソッドである にこの効果があることがわかります。)ReadsRJsValueRRReadsreads

すべてをまとめると、関数全体は、ResultJSON から変換する方法を知っているデータから を生成するコードのブロックを教えてください。関数の本体は、単純に JSON を目的の型に変換しようとします (アンマーシャリングと呼ばれます)。これが成功すると、ブロックが実行されます。そうしないと、BadRequestクライアント エラーが発生します。

コンパイラーは、クライアントによって実際に提供される JSON が何らかのタイプに変換可能かどうかを知ることができませんがR、JSON ->Rコンバーターと、実際のデータで失敗した場合のエラー処理コードが必要になる場合があります。

于 2016-10-22T06:15:17.120 に答える