2017-01-24 2 views
1

Привет, ребята, у меня проблема, я не могу сериализовать свойства BaseEntity для mongodb, он только сериализует (адрес электронной почты, имя, пароль) и создает поле _id.Playframework JSON Inheritance

Вот код:

trait Entity[K] { 
    val id: K 
    val createDate: DateTime 
    val updateDate: DateTime 
} 

class BaseEntity extends Entity[String] { 
    val id: String = java.util.UUID.randomUUID.toString 
    val createDate: DateTime = new DateTime(DateTimeZone.UTC) 
    val updateDate: DateTime = new DateTime(DateTimeZone.UTC) 
} 

case class User(name: String, email: String, password: String) extends BaseEntity 

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

#ReactiveMongo to insert the document 
def create(entity: E)(implicit ec: ExecutionContext): Future[Option[E]] = { 
    val doc = Json.toJson(entity).as[JsObject] 

    this.collection.flatMap(_.insert(doc)).flatMap(_ => Future.successful(Option(entity))) 
} 
+3

Как указано в [требования] (https://www.playframework.com/documentation/ 2.5.x/ScalaJsonAutomated # Requirements) для воспроизведения JSON, автоматическое сопоставление основано на функциях 'apply' /' unapply', а не на произвольном 'val' /' def'. Отображаются только параметры «apply». – cchantep

ответ

1

Вы могли бы реализовать операции записи или форматировать себя

implicit val writes: Writes[User] = new Writes[User] { 
    def writes(user: User): JsObject = Json.obj(
     "id" -> user.id, 
     "createDate" -> user.createDate.toString, 
     "updateDate" -> user.updateDate.toString, 
     "name" -> user.name, 
     "email" -> user.email, 
     "password" -> user.password 
    ) 
} 
+1

Лучше рассматривать 'OWrites', а не' Writes', чтобы сохранить специфику объекта. Доступен синтаксис 'OWrites [User] {user => ..}' (а не определение полностью анонимного класса). – cchantep

+0

Прохладный, я не знал, что спасибо – Tyler

Смежные вопросы