2016-07-07 4 views
0

Я пытаюсь вставить данные в MongoDB с помощью Play-scala и ReactiveMongo.Ошибка при попытке вставить данные в MongoDB

Вот мой DbimpService.scala:

package services 
import models.Post 
import reactivemongo.bson.BSONDocument 
import reactivemongo.api.MongoDriver 
import reactivemongo.api.collections.bson.BSONCollection 
import scala.concurrent.ExecutionContext 
import javax.inject.Inject 
import play.api.libs.json.Json 
import reactivemongo.play.json.collection.JSONCollection 
import reactivemongo.api.commands.WriteResult 
import scala.concurrent.Future 
import org.apache.xerces.util.DatatypeMessageFormatter 

class Dbimpservice @Inject() (implicit ec:ExecutionContext) extends Dbservice { 
    def create(p:Post):String={ 
      var status = "Not Saved" 
        val driver = new MongoDriver 
        val connection = driver.connection(List("localhost")) 
        val db = connection("application") 
        val collection = db[BSONCollection]("post") 
        val futureList = collection.insert[Post](p) 
        futureList.onComplete { case sucess => println(sucess) } 
      return status 
    } 
} 

Вот мой HomeController.scala:

package controllers 

import javax.inject._ 
import play.api._ 
import play.api.mvc._ 
import models._ 
import scala.util.{ Failure, Success } 
import scala.concurrent.Future 
import scala.concurrent.ExecutionContext.Implicits.global 
import reactivemongo.api.{ MongoDriver, MongoConnection } 
import reactivemongo.play.json.collection.JSONCollection 
import reactivemongo.bson.BSONDocument 
import reactivemongo.api.commands.WriteResult 
import reactivemongo.api.collections.bson.BSONCollection 
import play.api.libs.json.Json 
import services.Dbservice 
import services.Dbimpservice 
import services.Dbservice 
import scala.concurrent.ExecutionContext 
import scala.concurrent.Await 
import scala.concurrent.duration.Duration 

/** 
* This controller creates an `Action` to handle HTTP requests to the 
* application's home page. 
*/ 
@Singleton 
class HomeController @Inject() (implicit ec:ExecutionContext,val Dbservice : Dbimpservice)extends Controller { 

    /** 
    * Create an Action to render an HTML page with a welcome message. 
    * The configuration in the `routes` file means that this method 
    * will be called when the application receives a `GET` request with 
    * a path of `/`. 
    */ 
    def index = Action{ 
    Ok("Hai") 
    } 

    def read = Action.async { 
     val query = BSONDocument() 
        val driver = new MongoDriver 
        val connection = driver.connection(List("localhost:27017")) 
        val db = connection("application") 
        val collection = db[BSONCollection]("post") 
        val futureList = collection.find(query).cursor[Post]().collect[List]() 
        futureList.map { list => 
       Ok(list.toString()) 
      } 
    } 

    def create = Action(BodyParsers.parse.json) { request => 
    val personResult = request.body.validate[Post] 
    personResult.fold(
     errors => { 
     BadRequest(Json.obj("status " ->"ERROR")) 
     }, 
     valid = fun 
    ) 
    } 

    def fun:Post => Result= { post => 
     var ans = Dbservice.create(post) 
     Ok(ans) 
    } 

} 

Я пытаюсь вставить данные, но не будут вставлены, и ошибка, которую я получаю

Failure(reactivemongo.core.errors.ConnectionNotInitialized: MongoError['Connection is missing metadata (like protocol version, etc.) The connection pool is probably being initialized.']) 

Кто-нибудь, пожалуйста, помогите мне, я даже сослался на ссылку

http://stackoverflow.com/questions/31456517/embedmongo-with-reactivemongo-process-does-not-exit 

но не получил

+0

Вы должны указать версию БД и в Lib – cchantep

ответ

2

Гадать, что вы используете последнюю версию ReactiveMongo (0.11.7+), вы используете deprecated DB resolution код (connection(dbName) ака connection.apply(dbName).

See also

Вы должны использовать асинхронное разрешение, которое пользу от перехода на другой ресурс (для обработки возможных задержек в сети/инцидента). Следующий код должен быть реорганизован.

val db = connection("application") 
val collection = db[BSONCollection]("post") 
val futureList = collection.insert[Post](p) 

Используя новый DB resolution:

for { 
    db <- connection.database("application") 
    collection = db("post") 
    res <- collection.insert(p) 
} yield res 
+0

поблагодарить и, для этого ответа – raja

Смежные вопросы