我有使用反应式mongo插件的Play 2.3应用程序。 我有基础文件:
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]
}
因此,当我使用反应式mongo插件将其持久保存到mongo 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)
}
}
问题是我将从基础文档扩展许多文档,我不希望每次都初始化那些日期,可能还有其他一些领域。有可能做这样的事吗?
答案 0 :(得分:2)
首先,我们可以将问题的表面区域减半; 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
然后,相同的测试代码从play-json获得所需的行为:
{"name":"timmy","created":1410930805042,"updated":1410930805071}