Play フレームワークと Scala および Reactive Mongo を使用して、オブジェクトを mongodb データベースに保存しています。このhttp://reactivemongo.org/releases/0.10/documentation/bson/usage.htmlに従って、次のコードを思いつきました。
import java.util.Date
import com.google.inject.Inject
import model.User
import play.modules.reactivemongo.ReactiveMongoApi
import play.modules.reactivemongo.json.collection.JSONCollection
import reactivemongo.bson.{BSONDocument, BSONDocumentReader, BSONDocumentWriter, BSONObjectID}
import play.modules.reactivemongo.json._, ImplicitBSONHandlers._
import json.JsonFormatters._
class UserRepository @Inject() (val reactiveMongoApi : ReactiveMongoApi) {
private def users = reactiveMongoApi.db.collection[JSONCollection]("users")
def save(user: User) = {
users.insert(user)
}
implicit object UserWriter extends BSONDocumentWriter[User] {
def write(user: User) = {
BSONDocument(
"_id" -> Option(user.id).getOrElse(BSONObjectID.generate),
"name" -> user.name,
"email" -> user.email,
"companyName" -> user.companyName,
"created" -> Option(user.created).getOrElse(new Date)
)
}
}
implicit object UserReader extends BSONDocumentReader[User] {
def read(doc: BSONDocument): User = {
User(
doc.getAs[BSONObjectID]("_id").get,
doc.getAs[String]("name").get,
doc.getAs[String]("email").get,
doc.getAs[String]("companyName").get,
doc.getAs[Date]("created").get
)
}
}
}
BsonDocument に変換する暗黙のライターを作成したので、適切に変換されてデータベースに保存されることを期待していました。
ただし、コンパイルすると、次のようになります。
UserRepository.scala:18: No Json serializer as JsObject found for type model.User. Try to implement an implicit OWrites or OFormat for this type.
[error] Error occurred in an application involving default arguments.
[error] users.insert(user)
No Json serializer as JsObject found for type play.api.libs.json.JsObject で述べたように、必要なパッケージをインポートしています。また、以下を含む json.JsonFormatters._ もインポートしています。
implicit val userWrites : Format[User] = Json.format[User]
それでも、JsObject から User に変換できないという同じエラーが返されます。User エンティティが 5 つのフィールドを持つ単なるケース クラスであることを考えると、JsObject がどこにあるのかわかりません。
case class User(var id: BSONObjectID, var name: String, var email: String, var companyName: String, var created: Date) {
}
何か案は?私は何が欠けていますか?