идентификатор объекта scala salat меняется после вставки в базу данных

#mongodb #scala #spray #salat

#mongodb #scala #распыление #salat

Вопрос:

У меня проблема с библиотекой Salat в scala — у меня есть элемент класса case:

 case class Item(_id: ObjectId = new ObjectId, var name: String, var active: Boolean) extends WithId {
  override def id: Option[ObjectId] = Some(_id)
}
 

Поле _id создается при создании экземпляра элемента.

Я пытаюсь протестировать функциональность вставки элемента следующим образом:

   var itemObj = Item(name = "testItem", active = true)

  "MainService" should {
    "put an item into database" in {
      Put("/items/", itemObj) ~> mainRoute ~> check {
        val item = responseAs[Item]
        item.name === "testItem"
        item.active === true
        item._id === itemObj._id
        Item.findAll().toList.size === 1
      }
    }
}
 

Где PUT /items/ mapping соответствует распределенному HTTP-маршруту:

 put {
      entity(as[Item]) { item ⇒
        complete {
          Item.saveOrUpdate(item)
          logger.info("putting item {}", item)

          HttpResponse(
            StatusCodes.OK,
            HttpEntity(ContentTypes.`application/json`, grater[Item].toCompactJSON(item))
          )
        }
      }
    }
 

И определение saveOrUpdate выглядит следующим образом:

   def saveOrUpdate(t: T) = {
    t.id match {
      case Some(id) => dao.update(MongoDBObject("_id" -> id), t, false, false, new WriteConcern)
      case None => dao.insert(t)
    }
 

Теперь дело в том, что тест завершается неудачей при утверждении

 item._id === itemObj._id
 

Я понятия не имею, почему _id изменится, если я настраиваю его перед выполнением сохранения или обновления объекта.

Есть ли у кого-нибудь какие-нибудь идеи, почему это так действует и что я могу сделать, чтобы исправить это?

Лучший, Марчин

Ответ №1:

Я изменил библиотеку JSON с json4s на Spray Json, и, похоже, теперь она работает.