我在scala中的Salat库中遇到了一个问题-我有一个case类Item:
case class Item(_id: ObjectId = new ObjectId, var name: String, var active: Boolean) extends WithId {
override def id: Option[ObjectId] = Some(_id)
}
_id字段在Item实例化时创建。
我正在测试插入Item的功能,如下所示:
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/映射对应于Spray HTTP Route:
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会改变,如果我在做保存或更新实体之前设置它。
有没有人知道为什么它会这样做,我能做些什么来解决这个问题?
最好的,Marcin
我将JSON库从json4s更改为Spray JSON,现在似乎可以工作了