ReactiveMongo和Play框架:错误ConnectionNotInitialized

时间:2017-07-17 21:43:50

标签: mongodb scala reactivemongo play-reactivemongo

我正在尝试使用play framework和scala的“reactiveMongo”教程,但是我收到以下错误:

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

我的application.conf有:

play.modules.enabled += "play.modules.reactivemongo.ReactiveMongoModule"
mongodb.uri ="mongodb://localhost:27017/cambio"

我的build.sbt有:

libraryDependencies += "org.reactivemongo" %% "play2-reactivemongo" % "0.12.5-play26"

我的mongo已经开始了。

我的控制器是:

package controllers

    import javax.inject.Inject

    import scala.concurrent.Future

    import play.api.Logger
    import play.api.mvc.{ Action, Controller }
    import play.api.libs.concurrent.Execution.Implicits.defaultContext
    import play.api.libs.functional.syntax._
    import play.api.libs.json._

    // Reactive Mongo imports
    import reactivemongo.api.Cursor
    import reactivemongo.api.ReadPreference

    import play.modules.reactivemongo.{ // ReactiveMongo Play2 plugin
      MongoController,
      ReactiveMongoApi,
      ReactiveMongoComponents
    }

    // BSON-JSON conversions/collection
    import reactivemongo.play.json._
    import play.modules.reactivemongo.json.collection._

    /*
     * Example using ReactiveMongo + Play JSON library.
     *
     * There are two approaches demonstrated in this controller:
     * - using JsObjects directly
     * - using case classes that can be turned into JSON using Reads and Writes.
     *
     * This controller uses JsObjects directly.
     *
     * Instead of using the default Collection implementation (which interacts with
     * BSON structures + BSONReader/BSONWriter), we use a specialized
     * implementation that works with JsObject + Reads/Writes.
     *
     * Of course, you can still use the default Collection implementation
     * (BSONCollection.) See ReactiveMongo examples to learn how to use it.
     */
    class UserController @Inject() (val reactiveMongoApi: ReactiveMongoApi)
        extends Controller with MongoController with ReactiveMongoComponents {

      /*
       * Get a JSONCollection (a Collection implementation that is designed to work
       * with JsObject, Reads and Writes.)
       * Note that the `collection` is not a `val`, but a `def`. We do _not_ store
       * the collection reference to avoid potential problems in development with
       * Play hot-reloading.
       */
      def collection: JSONCollection = db.collection[JSONCollection]("broker")

      def index = Action { Ok("works") }

      def create(name: String, age: Int) = Action.async {
        val json = Json.obj(
          "name" -> name,
          "age" -> age,
          "created" -> new java.util.Date().getTime())

        collection.insert(json).map(lastError =>
          Ok("Mongo LastError: %s".format(lastError)))
      }

      def createFromJson = Action.async(parse.json) { request =>
        import play.api.libs.json.Reads._
        /*
         * request.body is a JsValue.
         * There is an implicit Writes that turns this JsValue as a JsObject,
         * so you can call insert() with this JsValue.
         * (insert() takes a JsObject as parameter, or anything that can be
         * turned into a JsObject using a Writes.)
         */
        val transformer: Reads[JsObject] =
          Reads.jsPickBranch[JsString](__ \ "firstName") and
            Reads.jsPickBranch[JsString](__ \ "lastName") and
            Reads.jsPickBranch[JsNumber](__ \ "age") reduce

        request.body.transform(transformer).map { result =>
          collection.insert(result).map { lastError =>
            Logger.debug(s"Successfully inserted with LastError: $lastError")
            Created
          }
        }.getOrElse(Future.successful(BadRequest("invalid json")))
      }

      def findByName(name: String) = Action.async {
        // let's do our query
        val cursor: Cursor[JsObject] = collection.
          // find all people with name `name`
          find(Json.obj("name" -> name)).
          // sort them by creation date
          sort(Json.obj("created" -> -1)).
          // perform the query and get a cursor of JsObject
          cursor[JsObject](ReadPreference.primary)

        // gather all the JsObjects in a list
        val futurePersonsList: Future[List[JsObject]] = cursor.collect[List]()

        // transform the list into a JsArray
        val futurePersonsJsonArray: Future[JsArray] =
          futurePersonsList.map { persons => Json.arr(persons) }

        // everything's ok! Let's reply with the array
        futurePersonsJsonArray.map { broker =>
          Ok(broker)
        }
      }
    }

我的路线是:

# Routes
    # This file defines all application routes (Higher priority routes first)
    # ~~~~

    # An example controller showing a sample home page
    GET     /                           controllers.HomeController.index
    GET     /crear/:name/:age           controllers.UserController.create(name: String, age: Int)
    GET     /buscar/:name           controllers.UserController.findByName(name: String)

    # Map static resources from the /public folder to the /assets URL path
    GET     /assets/*file               controllers.Assets.versioned(path="/public", file: Asset)

0 个答案:

没有答案