2015-01-07 61 views
1

我有基於JSON和play框架的scala REST服務。我有用戶的情況下類僅在REST JSON服務中公開字段子集。 Play框架,scala

case class User(_id: BSONObjectID, username: String,password: String,creationTime: org.joda.time.DateTime) 

object User{ 
val userReads: Reads[User] = (
(JsPath \ "username").read[String] (minLength[String](4) keepAnd maxLength[String] (32)) and 
(JsPath \ "password").read[String] (minLength[String](8) keepAnd maxLength[String] (32)) 
?????)(User.apply _) 

val userWrites: Writes[User] = .... 
implicit val userFormat: Format[User] = Format (userReads, userWrites) 
} 

在註冊期間(通過REST API)我需要驗證傳入的JSON。我只需要用戶名和密碼,而且我不需要_id,creationTime等。如何正確寫入讀取,寫入僅驗證字段的子集(請完成在您的代碼中讀取和替換「?????」)?

+0

因爲它們不是選項,我認爲您需要提供這些值來創建您的退出類的實例。在任何其他時間點,您的前端是否需要創建時間/ mongo ID? – Barry

回答

2

定義一個單獨的class,比方說,一個RegistrationUser並定義JSON讀取和寫入該class

case class RegistrationUser(userName: String, password: String) 

在DB層,你可以有一個這樣的類:

case class DbUser(_id: BSONObjectID, 
        username: String, 
        password: String, 
        creationTime: org.joda.time.DateTime) 

然後你可以像這樣映射這些類:

def saveUserToDb(registrationUser: RegistrationUser): Unit = { 
    val dbUser = DbUser(
    _id   = BSONObjectID.generate, 
    username  = registrationUser.username, 
    password  = registrationUser.password, 
    creationTime = DateTime.now 
    ) 

    // Now you have your DbUser and you can save it to Mongo as you did before 
} 

您不必在整個應用程序中使用相同的模型。對於單獨的圖層 - UI,服務,數據庫...有單獨的模型是完全有效的......

+0

謝謝你的好回答。如何避免案例類中字段的重複?例如DbUser也會包含用戶名和密碼 – Alex

+0

我不擔心這一點。從技術上講,你可以創建一個包含這些字段的'trait',這兩個case類將擴展這個特性,但我沒有看到任何理由。有時候鬆耦合是很好的。如果更改一個(DB)模型,它不會更改其他(UI)模型。 –

+0

謝謝@Rado Buransky。我對這些技術很陌生。所以我有2個模型類:RegistrationUser和DbUser(字段inc id和creationTime的全套集合)。如何將RegistrationUser轉換爲DbUser並將id,creationTime保存到數據庫中。請一些代碼 – Alex