Я использую библиотеку Salat для сериализации классов case как объектов mongoDb. Мой файл Item.scala выглядит так:
case class Item(_id: String = (new ObjectId).toString, itemId: Int, var name: String, var active: Boolean) extends WithId {
override def id: ObjectId = new ObjectId(_id)
}
object Item extends MongoDb[Item] with MongoDao[Item] {
override def collectionName: String = "items"
}
object ItemJsonProtocol extends DefaultJsonProtocol {
implicit val itemFormat = jsonFormat4(Item.apply)
}
Теперь я использую его для публикации объектов Item в формате Json через Spray HTTP. Я хотел бы вызвать его следующим образом:
curl.exe -H "Content-Type: application/json" -X PUT -d "{\"itemId\":
1, \"active\":true, \"name\" : \"test\"}" http://localhost:8080/items/
надеясь, что он предоставит сгенерированный идентификатор, если я его не предоставлю.
Однако после вызова команды curl я получаю сообщение об ошибке:
Содержимое запроса было искажено: в объекте отсутствует обязательный член '_id'
Есть ли способ пометить поле _id как необязательное, не делая из него Option (это поле всегда будет установлено) и определяя пользовательский JsonFormat, таким образом (де) сериализуя объект самостоятельно?
Я прочитал этот пост: https://stackoverflow.com/a/10820293/1042869, но мне было интересно, есть любой другой способ сделать это, так как у меня много случаев полей _id. Также был комментарий, в котором говорилось: «Вы, но вы можете присвоить этому полю значение по умолчанию в определении класса case, поэтому, если поле не находится в json, оно присвоит ему значение по умолчанию.», но, как вы можете видеть здесь это не работает.
Лучший, Марчин
case class Item(_id: Option[String] = Some((new ObjectId).toString) ...
? - person Gangstead   schedule 01.07.2014