Hen*_*dri 0 json asynchronous scala playframework play-reactivemongo
我正在尝试使用以下方法创建一个向mongoddb插入数据的帖子请求:1.sbt 0.13.6 2.播放2.10 3. scala 2.11.2 4. play2-reactivamongo 0.10.2 5. mongodb 2.6.4
数据由json发布,并为模型创建一个case类,并使用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)
}
Run Code Online (Sandbox Code Playgroud)
我已经看到一些示例代码使用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")
}
Run Code Online (Sandbox Code Playgroud)
所以我决定使用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....
Run Code Online (Sandbox Code Playgroud)
当我试图重新加载请求时,它显示另一个错误:
! 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)
Run Code Online (Sandbox Code Playgroud)
任何人都有解决我的问题的方法吗?
您的代码的问题在于您正在使用Future回调来操作可变变量.该函数将在Future完成之前很久返回,因此回调基本上什么都不做.相反,你应该使用Action.async,并map在Future你的期望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) }
}
Run Code Online (Sandbox Code Playgroud)
甚至更好:
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) }
}
)
}
Run Code Online (Sandbox Code Playgroud)
(可能不会立即编译,因为我不知道是什么collection.insert)
| 归档时间: |
|
| 查看次数: |
1651 次 |
| 最近记录: |