Play 2.5和ReactiveMongo 0.11编译错误:值find不是scala.concurrent.Future

时间:2016-12-29 23:27:38

标签: scala

我用Play!2.5创建了一个简单的应用程序,其中表单中的数据被写入我使用ReactiveMongo 0.11的数据库。

目前我正在尝试获取索引页面以显示数据库中的所有条目。

我的代码:

    def index = Action.async{

    val cursor: Cursor[User] = collectionF.find(Json.obj()).cursor[User]

    val futureUserList :Future[List[User]] = cursor.collect[List]()

    val futureUserListJsonArray :Future[JsArray] = futureUserList.map{user =>
      Json.arr(user)
    }

    futureUserListJsonArray.map{ user=>
      Ok(user)
    }
  }

我收到以下编译错误:

value find不是scala.concurrent.Future的成员[reactivemongo.play.json.collection.JSONCollection ]

find 指的是第二行的 collectionF.find()

这是我在并发方面导入的内容:

import scala.concurrent.Future

import play.api.libs.concurrent.Execution.Implicits.defaultContext

由于

1 个答案:

答案 0 :(得分:0)

正如cchantep已在评论中指出,您试图在find上呼叫Future,而不是在ReactiveMongo的JSONCollection上呼叫,您需要一种方法来访问{{1}相反。

但是,我想知道你最初是如何使用JSONCollection的。这不仅仅是我无法想象这样做的可行理由,之后使​​用该构造也很麻烦。是的,您可以使用例如Future[JSONCollection] map可以访问JSONCollection,但这意味着返回的Cursor也是Future(这会迫使您flatMap进行任何操作使用Cursor)。

val cursor: Future[Cursor[User]] = collectionF.map(_.find(...).cursor[User])
val users = cursor.flatMap(...)

查看ReactiveMongo播放插件的documentation,特别是在页面底部的示例中:

class Application @Inject() (val reactiveMongoApi: ReactiveMongoApi)
    extends Controller with MongoController with ReactiveMongoComponents {

  // no Future here:
  def collection: JSONCollection = db.collection[JSONCollection]("users")

}