在玩!应用程序基础文档字段不会持久化到mongo db(反应性mongo插件)

问题描述:

我有Play 2.3应用程序与反应性mongo插件。 我有基本文档:在玩!应用程序基础文档字段不会持久化到mongo db(反应性mongo插件)

trait TemporalDocument { 
    val created: Option[DateTime] = Some(new DateTime()) 
    val updated: Option[DateTime] = Some(new DateTime()) 
} 

和具体文件之一:

case class User(name: String) extends TemporalDocument 

object User{ 
    implicit val userFormat = Json.format[User] 
} 

所以,当我坚持它蒙戈DB使用反应蒙戈插件仅仅名坚持着,创建/更新的字段是不是。

我的库看起来像是:

trait MongoDocumentRepository[T <: TemporalDocument] extends ContextHolder { 

    private val db = ReactiveMongoPlugin.db 

    def insert(document: T)(implicit writer: Writes[T]): Future[String] = { 
    collection.insert(document).map { 
     lastError => lastError.toString 
    } recover { 
     case e: Exception => sys.error(e.getMessage) 
    } 
    } 

    private def collection: JSONCollection = db.collection[JSONCollection](collectionName) 

    implicit object BSONDateTimeHandler extends BSONHandler[BSONDateTime, DateTime] { 
    def read(time: BSONDateTime) = new DateTime(time.value) 

    def write(jdtime: DateTime) = BSONDateTime(jdtime.getMillis) 
    } 
} 

问题是,我将有很多的文件从基本的文档扩展,我不想初始化这些日期,可能有一些其他领域的每一次。是否有可能做这样的事情?

首先,我们可以减半问题的表面积; Reactive Mongo和/或Play Reactive Mongo插件在这里并不相关,它是Play's JSON macros,它们负责构建适当的JSON结构(在这种情况下)。

如果我成立了一个TemporalDocumentUser在你的代码,然后写出来:

val user = User("timmy") 

println(Json.toJson(user)) 

我得到:

{"name":"timmy"} 

我还没有研究,但我怀疑这是因为createdupdated字段未出现在User案例类别的“字段列表”中。

如果我返工你的代码有点像这样:

trait TemporalDocument { 
    val created: Option[DateTime] 
    val updated: Option[DateTime] 
} 

case class User(
       name: String, 
       val created: Option[DateTime] = Some(new DateTime()), 
       val updated: Option[DateTime] = Some(new DateTime())) 
       extends TemporalDocument 

然后在相同的测试代码从播放JSON所需的行为:

{"name":"timmy","created":1410930805042,"updated":1410930805071} 
+0

你甚至不需要'VAL在'User'构造函数中,因为case类的构造函数参数默认是public'val's – yahor 2016-06-08 01:36:02