2013-03-01 8 views
3

Я создаю Rest API с распылением на вершине mongodb для некоторых операций CRUD, все это прекрасно работает, ожидайте всякий раз, когда я пытаюсь проверить его со спецификациями2 следующую спецификациюHowto test Custom Json Objects with Spray Routing

class RestServiceSpec extends Specification with Specs2RouteTest with RoutingRestService 

    // database initialization removed for clarity 

    "The rest service" should 
    "have a player called 'Theo TestPlayer' in the db" in { 
     Get("/api/1.0/player/" + player1._id) ~> restRoute ~> check { 
     entityAs[Player] must be equalTo(player1) 
     } 
    } 
    } 

// some more specs removed for clarity 
} 

он потерпит неудачу со следующей ошибкой:

MalformedContent(invalid ObjectId ["51308c134820cf957c4c51ca"],Some(java.lang.IllegalArgumentException: invalid ObjectId ["51308c134820cf957c4c51ca"])) (Specs2Interface.scala:25) 

Я понятия не имею, где искать, как ссылки на исходный файл и линии номер точки к общей failTest (тзд: String) метод

некоторые подробнее:

У меня есть случай класс, который я упорствовать в Монго, используя SalatDAO

case class Player(@Key("_id") _id:ObjectId = new ObjectId(), name:String, email:String, age:Int) {} 

где ObjectId() класса является то, что оборачивает поколение ID MongoDB в , чтобы получить это (не) выстроил через spray_json Я создал несколько jsonFormats

object MyJsonProtocol { 
    implicit val objectIdFormat = new JsonFormat[ObjectId] { 
    def write(o:ObjectId) = JsString(o.toString) 
    def read(value:JsValue) = new ObjectId(value.toString()) 
    } 
    implicit val PlayerFormat = jsonFormat(Player, "_id", "name", "email", "age") 

и соответствующую часть моего маршрута (обработки удалены ошибки и протоколирования):

path("player"/"\\w+".r) {id:String => 
    get { 
     respondWithMediaType(`application/json`) { 
     complete { 
      PlayerCRUD.getById(id) 
     } 
     } 
    } ~ 

ответ

3

Поскольку никто не знает, я изменил _id от будучи ObjectId() для только строки, и имеющий helpermethod создать его из нового ObjectId(). ToString, где требуется

+1

Спасибо , У меня была такая же проблема, и мне удалось решить ее, прочитав ваш вопрос и ответ :) – Marcin

1
implicit object ObjectIdJsonFormat extends JsonFormat[ObjectId] { 
    def write(obj: ObjectId): JsValue = JsString(obj.toString) 

    def read(json: JsValue): ObjectId = json match { 
     case JsString(str) => new ObjectId(str) 
     case _ => throw new DeserializationException(" string expected") 
    } 
    } 
+0

Формфортеры спрей-json строятся вокруг возможности компоновки ваших форматировщиков, и у нее уже есть форматы для всех типов по умолчанию, поэтому только форматирование для типы, которые он не поддерживает, должны быть необходимы –