2013-03-22 64 views
2

如果我尝试在内存服务中的securesocial中使用play-reactive mongo,我会得到一个错误。Play-ReactiveMongo - 可以在控制器之外使用插件吗?

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]() 
[...] 

但似乎到控制器内工作好吗:

import play.api.Play.current 

object Application extends Controller with securesocial.core.SecureSocial { 


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

是否可以使用播放上下文中的控制器之外的?

错误我得到的是尝试访问的资源,使用所述类投掷的错误时:

! @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] 
+0

解决它是一个完整的堆栈跟踪? – Jorge 2013-03-26 00:57:25

+0

这是一个堆栈溢出,所以你会看到我用一个[重复很多]省略了无限循环。这是溢出的堆栈跟踪的顶部和底部。我假设你不需要所有的重复帧:) – JasonG 2013-03-27 08:53:52

回答

2

是的,它是可能的。我创建了一个插件来检查文件夹中的文件。如果发现它读取文件,然后将东西保存到我的mongo实例。

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") 
     } 
    } 
    } 
} 

魔术对我来说是在这两条线:

import scala.concurrent.ExecutionContext 
import ExecutionContext.Implicits.global 

希望它可以帮助=)

+0

感谢您的答案。我会试一试。 – JasonG 2013-04-26 16:20:47

+0

我现在对阿卡更加熟悉 - 没有在那篇文章上工作过。我会检查执行上下文。 – JasonG 2013-04-26 16:21:07

2

我有同样的错误,当我试图实现与ReactiveMongo的securesocial UserService。我最终改变

val db = ReactiveMongoPlugin.db(application) 

def db = ReactiveMongoPlugin.db(application) 
相关问题