나는 비 차단으로하려는 엔드 포인트에서 작업하고 있습니다. 이 엔드 포인트의 목적은 매우 간단합니다. 즉, Mongo 상점에 문서를 작성하십시오. Play 2.5.x 앱에서 공식 MongoDB Scala Driver을 사용하고 있습니다.스칼라 - Futures를 사용하는 예외 상황에서 실패한 응답을 보내는 방법
MongoDB는 toFuture()
메소드를 사용하여 Futures를 지원합니다.
내 컨트롤러의 처리 방법이 Future[Result]
유형으로 해결 될 것으로 예상됩니다. 그러나 onComplete
콜백 (또는 다른 콜백 함수)은 Unit
유형 만 반환하므로 컴파일 오류가 발생합니다. 이러한 상황에 사용되는 대체 패턴이 있습니까? 내 옵션은 무엇입니까?
주 - Play가 자동으로 500을 쓰거나 쓰지 않을 경우 Play가 예외를 catch한다는 것을 알고 있습니다. 그러나이 경우에는 내가 직접 당신이하려고하는 기반으로
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)
}
}
}
두 개의 오류가 발생합니다. 'InternalServerError'에서 첫 번째 유형이 일치하지 않으면 Throwable 유형이 필요합니다. 또한 전체 함수는'Unit'이 아닌'FutureResult '형식을 반환해야합니다. – satnam