2017-02-21 2 views
0

나는 비 차단으로하려는 엔드 포인트에서 작업하고 있습니다. 이 엔드 포인트의 목적은 매우 간단합니다. 즉, 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) 
     } 
    } 
    } 

답변

2

사용이 대신 onComplete. onComplete은 모든 부작용 작업을 수행하는 데 사용됩니다.

insertFuture 
    .map(_ => Ok("Inserted")) 
    .recover({case _ => InternalServerError}) 
1

, 당신은 아마 transform 방법을 찾고 그것을 처리 할 :

val res = insertFuture.transform(_ => Ok("Inserted"), _ => InternalServerError) 
+0

두 개의 오류가 발생합니다. 'InternalServerError'에서 첫 번째 유형이 일치하지 않으면 Throwable 유형이 필요합니다. 또한 전체 함수는'Unit'이 아닌'FutureResult '형식을 반환해야합니다. – satnam

관련 문제