2016-10-22 15 views
0

createUserまたはupdateUserは、unmarshalValueJs関数を使用して引数を渡す方法を教えてください。誰かがこのコードの実行方法を説明できますか?

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 
     ) 
    } 
} 

ユーザーが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) 

答えて

1

Rは型変数である。定義def unmarshalJsValue[R](request: Request[JsValue])(block: R => Result)(implicit rds : Reads[R])は読む:

  • 私はunmarshallJsValueと呼ばれる方法です。

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

  • Request[JsValue]という値(おそらくJSONエンティティの要求contan)が必要です。

  • タイプRの値を指定すると、Resultが生成される関数が必要です。

  • RReadsである値をimplicitスコープにする必要があります。言い換えれば、Rが何であってもJsValueRに変換する方法が必要です。 、全体の機能だけで言う、

はすべて一緒にそれを置くために(あなたがthe docs for Readsを見れば、あなたは。その唯一の方法、readsは、この効果を持っていることに気づくでしょう)私の生成コードのいくつかのブロックを与えますResult私はJSONからの変換方法を知っています。関数の本体は、JSONを目的の型(アンマーシャリング)に変換しようとします。これが成功するとブロックを実行します。それ以外の場合は、BadRequestクライアントエラーが発生します。

コンパイラは、クライアントによって実際の生活の中で提供されますJSONは、いくつかのタイプRに変換できるかどうかを知ることはできませんが、それはJSON必要とすることができます - それは上の障害が発生した場合>Rコンバータ、およびいくつかのエラー処理コードを実データ。

関連する問題