2014-12-30 2 views
0

play 2.0을 사용하여 REST API를 작성하려고합니다. updateMember 메서드로 업데이트 할 수없는 일부 필드 (예 : 사용자 이름 & 암호)가 포함 된 사용자 사례 클래스가 있습니다.제출 된 json을 Play 2.0으로 변환하는 방법은 무엇입니까?

package controllers.api 

import org.joda.time.LocalDate 
import play.api.Play.current 
import play.api.db.slick.{DB, Session} 
import play.api.mvc._ 
import play.api.libs.json._ 
import play.api.libs.functional.syntax._ 
import models.{Gender, User, UserId} 
import repositories.UserRepository 

object Member extends Controller { 
    def updateMember(id: Long) = Action { 
DB.withSession { 
    implicit session: Session => 

    val json: JsValue = request.body.asJson    // how to deal with this? 

    val repository = new UserRepository 
    repository.findById(new UserId(id)).map { 
     user => 
     def usernameAppender = __.json.update(
      __.read[JsObject].map { o => o ++ Json.obj("username" -> user.username) } 
     ) 

     json.transform(usernameAppender)    // transform not found 

     Ok("updated") 
    }.getOrElse(NotFound) 
    } 
} 
} 

내가 map 전화를 움직일 수 : request.body.asJson이 옵션 [JsValue]를 반환하고, 내 사용자 조회는 옵션을 반환하기 때문에

좋은 기능성 방법은, 어떻게 든 여러 옵션을 다루는 있나요 내가 요청을 구문 분석하려고하지만 그곳에는 이미 사용자와 같은 다른지도가 필요하다고 생각합니다. 이미 가지고있는 것과 같습니다. 그 스타일에서는 옵션 당 map이 필요합니다.

FP에서 이와 같이 여러 개의 옵션을 처리하는 더 좋은 방법이 있습니까?

답변

0

당신은 기본적으로 중첩 된 모나드 상대하고, 이러한 작업을위한 기본 도구는 두 가지 옵션이 None되는 것은 프로그램에 동일한 의미 론적 의미가 특히 경우, flatMap입니다 :

request.body.asJson.flatMap { requestJson => 
    val repository = new UserRepository 
    repository.findById(new UserId(id)).map { user => 
    def usernameAppender = __.json.update(
     __.read[JsObject].map { o => o ++ Json.obj("username" -> user.username) } 
    ) 

    requestJson.transform(usernameAppender) 

    Ok("updated") // EDIT: Do you not want to return the JSON? 
    } 
}.getOrElse(NotFound) 

을하지만 수도 None의 의미가 다른 경우도 있습니다.이 경우 패턴 일치를 개별적으로 처리하고 오류 사례를 별도로 처리해야합니다.

request.body.asJson match { 
    case Some(requestJson) => 
    val repository = new UserRepository 
    repository.findById(new UserId(id)).map { user => 
     def usernameAppender = __.json.update(
     __.read[JsObject].map { o => o ++ Json.obj("username" -> user.username) } 
    ) 

     requestJson.transform(usernameAppender) 

     Ok("updated") 
    }.getOrElse(NotFound) 
    case None => BadRequest // Or whatever you response makes sense for this case 
} 
+0

감사합니다. 당신도 내 다음 질문을 선매 :-). – jbrown

관련 문제