2017-08-20 7 views
1

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.

Répondre

1

utilisation dérivation automatique:

object EntitesJsonProtocol extends SprayJsonSupport with DefaultJsonProtocol { 
    implicit val placeResponseFormat = jsonFormat19(Person.apply) 
    def personToJson(p: Person) = p.toJson 
    } 

la sorte que vous n'avez pas la méthode personToJson est mis en œuvre pour contaminer votre code avec les importations de JSON, notez que l'ordre de la déclaration est importante si une personne est intégrée dans un éditeur vous devrez déclarer personFormat avant publisherFormat