首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Play-ReactiveMongo -可以在控制器之外使用插件吗?

Play-ReactiveMongo -可以在控制器之外使用插件吗?
EN

Stack Overflow用户
提问于 2013-03-22 12:47:52
回答 2查看 1K关注 0票数 2

如果我试图在一个安全的内存服务中使用play-reactive mongo,我会得到一个错误。

代码语言:javascript
复制
import play.api.Play.current

/**
 * A Sample In Memory user service in Scala
 *
 * IMPORTANT: This is just a sample and not suitable for a production environment since
 * it stores everything in memory.
 */
class InMemoryUserService(application: Application) extends UserServicePlugin(application) {

  private var users = Map[String, Identity]()
  private var tokens = Map[String, Token]()
[...]

但它在控制器中似乎工作得很好:

代码语言:javascript
复制
import play.api.Play.current

object Application extends Controller with securesocial.core.SecureSocial {


  val db = ReactiveMongoPlugin.db
  lazy val collections = db("persons")
[...]

可以在控制器之外使用播放上下文吗?

我得到的错误是当我试图访问一个使用上述类的资源时抛出错误:

代码语言:javascript
复制
! @6dl5aj9h3 - Internal server error, for (GET) [/login] ->

play.api.PlayException: Cannot load plugin[An exception occurred during Plugin [service.InMemoryUserService] initialization]
    at play.api.WithDefaultPlugins$$anonfun$plugins$1$$anonfun$apply$9.apply(Application.scala:149) ~[play_2.10.jar:2.1.0]
    at play.api.WithDefaultPlugins$$anonfun$plugins$1$$anonfun$apply$9.apply(Application.scala:130) ~[play_2.10.jar:2.1.0]
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) ~[scala-library.jar:na]
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) ~[scala-library.jar:na]
    at scala.collection.immutable.List.foreach(List.scala:309) ~[scala-library.jar:na]
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:244) ~[scala-library.jar:na]
Caused by: play.api.PlayException: Cannot load plugin[An exception occurred during Plugin [service.InMemoryUserService] initialization]
    at play.api.WithDefaultPlugins$$anonfun$plugins$1$$anonfun$apply$9.apply(Application.scala:149) ~[play_2.10.jar:2.1.0]
    at play.api.WithDefaultPlugins$$anonfun$plugins$1$$anonfun$apply$9.apply(Application.scala:130) ~[play_2.10.jar:2.1.0]
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) ~[scala-library.jar:na]
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) ~[scala-library.jar:na]
    at scala.collection.immutable.List.foreach(List.scala:309) ~[scala-library.jar:na]
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:244) ~[scala-library.jar:na]
         [repeats a lot]
Caused by: play.api.PlayException: Cannot load plugin[An exception occurred during Plugin [service.InMemoryUserService] initialization]
    at play.api.WithDefaultPlugins$$anonfun$plugins$1$$anonfun$apply$9.apply(Application.scala:149) ~[play_2.10.jar:2.1.0]
    at play.api.WithDefaultPlugins$$anonfun$plugins$1$$anonfun$apply$9.apply(Application.scala:130) ~[play_2.10.jar:2.1.0]
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) ~[scala-library.jar:na]
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) ~[scala-library.jar:na]
    at scala.collection.immutable.List.foreach(List.scala:309) ~[scala-library.jar:na]
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:244) ~[scala-library.jar:na]
java.lang.StackOverflowError: null
    at java.io.UnixFileSystem.getBooleanAttributes0(Native Method) ~[na:1.6.0_43]
    at java.io.UnixFileSystem.getBooleanAttributes(UnixFileSystem.java:228) ~[na:1.6.0_43]
    at java.io.File.exists(File.java:733) ~[na:1.6.0_43]
    at sun.misc.URLClassPath$FileLoader.getResource(URLClassPath.java:999) ~[na:1.6.0_43]
    at sun.misc.URLClassPath$FileLoader.findResource(URLClassPath.java:966) ~[na:1.6.0_43]
    at sun.misc.URLClassPath$1.next(URLClassPath.java:196) ~[na:1.6.0_43]
EN

回答 2

Stack Overflow用户

发布于 2013-04-26 21:21:58

是的,这是可能的。我已经创建了一个检查文件夹中文件的插件。如果找到,它会读取该文件,然后将内容保存到我的mongo实例中。

代码语言:javascript
复制
package plugins

import play.api.{Logger, Application, Plugin}
import akka.actor.Cancellable
import play.api.libs.concurrent.Akka
import scala.io.Source
import scalax.file.Path
import org.joda.time.DateTime
import org.joda.time.format.DateTimeFormat
import play.modules.reactivemongo.ReactiveMongoPlugin
import java.io.{IOException, FileNotFoundException}
import models.LeadCategory
import reactivemongo.api.DefaultDB
import scala.concurrent.ExecutionContext
import ExecutionContext.Implicits.global

/**
 * User: jakobdobrzynski
 * Date: 4/24/13
 * Time: 10:34 AM
 */
class WordImporter(application: Application) extends Plugin {

  val defaultInterval = 2
  var cancellable: Option[Cancellable] = None    

  val leadCategoryPathKey = "lead.categories.path"
  val newFile = ".new"
  val doneFiles = ".done"


  override def onStop() {
    cancellable.map(_.cancel())
  }

  override def onStart() {
    import play.api.Play.current
    import scala.concurrent.duration._
    import play.api.libs.concurrent.Execution.Implicits._

    val i = defaultInterval
    val newPath = current.configuration.getString(leadCategoryPathKey + newFile).getOrElse("")
    val donePath = current.configuration.getString(leadCategoryPathKey + doneFiles).getOrElse("")
    val db = ReactiveMongoPlugin.db

    cancellable = if (true) {
      Some(
        Akka.system.scheduler.schedule(0 seconds, i minutes) {
          Logger.info("Looking for files")
          val files = new java.io.File(newPath).listFiles
          for(f <- files) {
            if(f.getName.endsWith(".csv")) {
              handleCsvFile(f.getName, newPath, donePath, db)
            }
          }
          Logger.info("Done looking for files")
        })

    } else None
  }

  /*
  "caregoryId" -> BSONLong(leadCategory.categoryId),
  "categoryName" -> BSONString(leadCategory.categoryName),
  "word" -> BSONString(leadCategory.categoryName),
  "creationDate" -> leadCategory.creationDate.map(date => BSONDateTime(date.getMillis)),
  "updateDate" -> leadCategory.updateDate.map(date => BSONDateTime(date.getMillis)))
  */

  def handleCsvFile(fileName: String, newPath: String, donePath: String, db : DefaultDB) =    {

    Logger.info("Handling csv file: "+fileName)    
    lazy val collection = db("leadCategories")    
    try {
      val file = Source.fromFile(newPath + fileName)
      val iter = file.getLines().map(_.split(","))
      iter foreach (a => {
        collection.insert(LeadCategory(None, a(2).toLong, (""+a(1)).toLowerCase(), (""+a(0)).toLowerCase(), Some(DateTime.now()), Some(DateTime.now())))
      })
      Logger.info("Reading done! Time to move file")
      val path: Path = Path.fromString(newPath+fileName)

      val now = DateTime.now()
      val pattern = DateTimeFormat.forPattern("dd-MM-yyyy-hh-mm-ss")
      val nameParts = fileName.split("\\.")
      val dest: Path = Path.fromString(donePath+nameParts(0)+"-" + pattern.print(now) + "."+nameParts(1))
      path.moveTo(target = dest)
    } catch {
      case e: FileNotFoundException => {
        Logger.error("No file found")
      }
      case e: IOException => {
        Logger.error("Something went wrong when reading the file")
      }
    }
  }
}

对我来说,神奇之处在于这两行:

代码语言:javascript
复制
import scala.concurrent.ExecutionContext
import ExecutionContext.Implicits.global

希望这会有帮助=)

票数 2
EN

Stack Overflow用户

发布于 2013-11-21 08:31:21

当我试图用ReactiveMongo实现securesocial时,我也遇到了同样的错误。我最终通过改变解决了这个问题

代码语言:javascript
复制
  val db = ReactiveMongoPlugin.db(application)

代码语言:javascript
复制
  def db = ReactiveMongoPlugin.db(application)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15562923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档