ノンブロッキングにするエンドポイントで作業しています。このエンドポイントの目的は非常に簡単です。つまり、Mongoストアにドキュメントを書き込むことです。 Play 2.5.xアプリで公式MongoDB Scala Driverを使用しています。Scala - 先物を使用して例外が発生した場合に失敗した応答を送信する方法
MongoDBはtoFuture()
メソッドを使用して先物をサポートしています。
問題は、コントローラの処理方法がタイプFuture[Result]
に解決されることが予想されることです。ただし、onComplete
コールバック(または他のコールバック関数)はタイプUnit
のみを返し、コンパイルエラーが発生します。これらの状況に使用されている代替パターンがありますか?私の選択肢は何ですか?
注 - 自動的に500を書き込んで投げられなかった場合、Playは例外をキャッチすることを理解します。しかし、この場合、私は手動であなたがやろうとしているに基づいて
class WriteController extends Controller {
def writeSingleEvent = Action.async { implicit request =>
val mongo = mongoService.getMongoClient() // my mongoservice
val database_name: String = request.getQueryString("database").getOrElse("")
val collection_name: String = request.getQueryString("collection").getOrElse("")
if (database_name == "" || collection_name == "") {
Future(BadRequest("Must specify database and collection names"))
} else {
val database = mongo.getDatabase(database_name)
val collection = database.getCollection(collection_name)
val body = request.body.asJson.get.toString
val bsondocument = BsonDocument.apply(body)
val document = Document(bsondocument)
val insertFuture = collection.insertOne(document).toFuture()
insertFuture.onComplete {
case Success(_) => Future(Ok("Inserted"))
case Failure(_) => Future(InternalServerError)
}
}
}
2つのエラーが発生します。 'InternalServerError'の最初の型の不一致は、型Throwableが必要です。また、全体関数は 'Unit'ではなく' FutureResult '型を返すべきです。 – satnam