繁体   English   中英

Action(parser.json)vs Action.async错误,并且使用并发.Execution.Implicits无法在Play Scala中初始化类控制器

[英]Action(parser.json) vs Action.async Error, and using concurrent.Execution.Implicits made could not initialize class controllers in Play Scala

我正在尝试创建一个使用以下数据向mongoddb插入数据的发布请求:1. sbt 0.13.6 2. play 2.10 3. scala 2.11.2 4. play2-reactivamongo 0.10.2 5. mongodb 2.6.4

数据通过json发布,并为模型创建案例类,然后使用JSPath将json转换为实体类。

这是我的示例代码:

def inserTransaction = Action(parser.json) { implicit request =>

   val json = request.body
   val data = json.as[Transaction]
   Logger.info(data.toString)
   val future = collection.insert(data.copy(id = Option[BSONObjectID](BSONObjectID.generate)))
   var result = ""

   future.onComplete {
     case Failure(t) => result = "An error has occured: " + t.getMessage
     case Success(post) => result = "success"
   }
   Ok(result)
}

我已经看到一些示例代码,这些示例代码使用Action.sync在控制器中处理异步,但是当我尝试使用Action.sync时,我的Intellij IDE检测到错误“无法将Action.sync解析为签名”,我试图进行更改这样的功能的结果

future.onComplete {
    case Failure(t) => Ok("An error has occured: " + t.getMessage)
    case Success(post) => Ok("success")
  }

因此,我决定使用Action(parser.json),但是来自激活器播放的问题是告诉我应该在代码中使用“ import play.api.libs.concurrent.Execution.Implicits._”。 但是当我导入库时,出现了一个新错误:

 ! Internal server error, for (POST) [/insertdata] ->

java.lang.ExceptionInInitializerError: null ....

Caused by: play.api.PlayException: ReactiveMongoPlugin Error[The ReactiveMongoPlugin has not been         
initialized! Please edit your conf/play.plugins file and add the following line....

当我尝试重新加载请求时,它显示了另一个错误:

! Internal server error, for (POST) [/api/insertdata] ->

java.lang.NoClassDefFoundError: Could not initialize class controllers.TransactionController$

[error] application - Error while rendering default error page
scala.MatchError: java.lang.NoClassDefFoundError: Could not initialize class 
controllers.TransactionController$ (of class java.lang.NoClassDefFoundError)

有人对我的问题有解决方案吗?

代码的问题在于,您正在使用Future回调来操纵可变变量。 该函数将在Future完成之前很久就返回,因此回调实际上不执行任何操作。 相反,您应该使用Action.async并将Future map到所需的Result 您也可以使用recover来处理任何故障。

您的代码应如下所示:

def inserTransaction = Action(parser.json).async { implicit request =>
   val json = request.body
   val data = json.as[Transaction]
   Logger.info(data.toString)
   val future = collection.insert(data.copy(id = Option[BSONObjectID](BSONObjectID.generate)))

   future.map(result => Ok(result))
       .recover { t: Throwable => Ok("An error has occured: " + t.getMessage) }
}

甚至更好:

def inserTransaction = Action(parser.json).async { implicit request =>
   request.body.validate[Transaction].fold(
       error => Future.successful(Ok("json errors...")),
       data => {
           collection.insert(data.copy(id = Option[BSONObjectID](BSONObjectID.generate)))
              .map(result => Ok(result))
              .recover { t: Throwable => Ok("An error has occured: " + t.getMessage) }
       }
   )
}

(可能不立即编译,因为我不知道collection.insert什么作用)

这个问题可能会有所帮助: 在Play Framework 2.2中使用非异步操作是否有任何好处?

动作与Action.async

如果您想到采取,输入和产生输出的高级操作,那么这两个操作是相同的,但略有不同。 两者都接受请求并输出结果。 Action.async允许操作代码正确处理期货。 我跳过了一些细节,但我希望这会有所帮助。

您可以粘贴插件文件吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM