2015-08-02 30 views
5

Bir Play Framework 2 projesinde MongoDB Async Java Driver kullanmak istiyorum, MongoDB Async Java Sürücüsü SingleResponseCallback'i döndürür. Bu tür sonuçların nasıl ele alınacağını bilmiyorum Oynatma denetleyicileri.MongoDB Async Java Sürücüsü, Play Framework 2.x eyleminde nasıl kullanılır?

Örneğin nasıl bir Oynat denetleyicisi aşağıdaki koddan sayısını döndürmek için:

collection.count(
new SingleResultCallback<Long>() { 
    @Override 
    public void onResult(final Long count, final Throwable t) { 
     System.out.println(count); 
    } 
}); 

ı söz dönüştürmek ardından SingleResultCallback kaynaklanabilir ve alabilirim? iyi bir yol mu? Bu durumlarda en iyi uygulama nedir?

cevap

2

Sözü kendiniz çözmelisiniz. Play vaatlerinin scala futures'ına ait sargılar olduğunu ve bir geleceği çözmenin tek yolunun scala Promises'i (oyun sözlerinden farklı olarak) kullandığını unutmayın (Biliyorum, biraz kafa karıştırıcı). Böyle bir şey yapmak zorunda olurdu: Promise$.MODULE$.apply() hakkında

Promise<Long> promise = Promise$.MODULE$.apply(); 
collection.count(
new SingleResultCallback<Long>() { 
    @Override 
    public void onResult(final Long count, final Throwable t) { 
    promise.success(count); 
    } 
}); 
return F.Promise.wrap(promise.future()); 

O şey sadece java dan scala nesnelere erişmek için bir yoldur. @caeus cevap

+0

Yanıtınız için teşekkür ederiz. Benim problemimi çözer. Daha fazla detay ile yeni bir cevap ekleyeceğim. –

0

sayesinde bu ayrıntılar ise:

public F.Promise<Result> index() { 
    return F.Promise.wrap(calculateCount()) 
      .map((Long response) -> ok(response.toString())); 
} 


private Future<Long> calculateCount() { 
    Promise<Long> promise = Promise$.MODULE$.apply(); 

    collection.count(
      new SingleResultCallback<Long>() { 
       @Override 
       public void onResult(final Long count, final Throwable t) { 
        promise.success(count); 
       } 
      }); 

    return promise.future(); 
} 
0

Bir temizlikçi çözüm F.RedeemablePromise<A> kullanmak olacaktır.

public F.Promise<Result> index() { 
    F.RedeemablePromise<Long> promise = F.RedeemablePromise.empty(); 

    collection.count(new SingleResultCallback<Long>() { 
     @Override 
     public void onResult(final Long count, final Throwable t) { 
      promise.success(count); 
     } 
    }); 

    return promise.map((Long response) -> ok(response.toString())); 
}