【问题标题】:Expose only field subset in REST JSON Service. Play framework, scala仅公开 REST JSON 服务中的字段子集。播放框架,scala
【发布时间】:2015-01-07 10:11:00
【问题描述】:

我有基于 JSON 和播放框架的 scala REST 服务。我有用户案例类

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 等。如何正确编写读取、写入以仅验证字段的子集(请在您的代码上完成读取并替换“?????”)?

【问题讨论】:

  • 因为它们不是选项,我认为您需要提供这些值来创建现有类的实例。在任何其他时间点,您的前端是否需要创建时间/mongo id?

标签: json scala rest playframework


【解决方案1】:

定义一个单独的class,比如说RegistrationUser,并为此class定义JSON读取和写入:

 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、服务、数据库……

【讨论】:

  • 谢谢你的好回答。如何避免案例类中的字段重复?例如 DbUser 也将包含用户名和密码
  • 我不会担心这个。从技术上讲,您可以创建一个包含这些字段的trait,并且两个案例类都将扩展此特征,但我看不出任何原因。有时松散耦合是件好事。如果您更改一个 (DB) 模型,它不会更改另一个 (UI) 模型。
  • 谢谢@Rado Buransky。我是这些技术的新手。所以我有 2 个模型类:RegistrationUser 和 DbUser(完整的字段集包括 id 和 creationTime)。如何将 RegistrationUser 转换为 DbUser 并分配 id、creationTime 以保存到 DB。请一些代码
猜你喜欢
  • 2016-08-03
  • 2013-07-11
  • 2014-10-08
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 2013-04-04
相关资源
最近更新 更多