Je construis une API REST simple en utilisant Akka-HTTP et MongoDB pour la persistance. Pour les requêtes HTTP Marshalling et Unmarshalling, j'utilise spray json. A la suite MongoDB documentation je définissais des entités telles que:Akka HTTP Json Marshalling
package entities
import org.mongodb.scala.bson.ObjectId
case class Person(
_id: ObjectId,
firstName: String,
lastName: String,
email: String,
emailConfirmed: Boolean,
telephone: String,
...
)
object Person {
def apply(
firstName: String,
lastName: String,
email: String,
telephone: String,
...
): Publisher = new Publisher(
new ObjectId(),
firstName,
lastName,
email,
false,
telephone,
...
)
}
Le problème avec cette approche est que je dois écrire beaucoup de code boilerplate pour permettre Marshalling-unmarshalling:
implicit object PublisherItemFormat extends RootJsonFormat[Publisher] {
def write(publisher: Publisher) = JsObject(
"_id" -> JsString(publisher._id.toString),
"firstName" -> JsString(publisher.firstName),
"lastName" -> JsString(publisher.lastName),
"email" -> JsString(publisher.email),
"telephone" -> JsString(publisher.telephone),
...
)
def read(json: JsValue) = {
val jsObject = json.asJsObject
jsObject.getFields(
"_id",
"firstName",
"lastName",
"email",
"telephone",
...
) match {
case Seq(
_id,
firstName,
lastName,
email,
telephone,
...
) ⇒ Publisher(
firstName.convertTo[String],
lastName.convertTo[String],
email.convertTo[String],
telephone.convertTo[String],
...
)
}
}
}
J'ai environ 10 entités différentes qui doivent être sauvegardés dans le Mongo, et chacun d'eux a 5-15 champs. Avec ce nombre d'entités, ce type d'approche produira trop de passe-partout.
Ce qui pourrait être une meilleure façon de le faire, avec moins de plaque d'immatriculation? Peut-être existe-t-il une autre bibliothèque Json-sérialisation au lieu de "spray-json" qui peut comprendre les choses automatiquement avec moins de code?
Ou comment puis-je définir la classe de brassage pour org.mongodb.scala.bson.ObjectId
en utilisant Spray-Json? Cela aidera également à se débarrasser du code standard.