在玩!应用程序基础文档字段不会持久化到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结构(在这种情况下)。
如果我成立了一个TemporalDocument
和User
在你的代码,然后写出来:
val user = User("timmy")
println(Json.toJson(user))
我得到:
{"name":"timmy"}
我还没有研究,但我怀疑这是因为created
和updated
字段未出现在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}
你甚至不需要'VAL在'User'构造函数中,因为case类的构造函数参数默认是public'val's – yahor 2016-06-08 01:36:02