2015-08-02 28 views
5

Desidero utilizzare MongoDB Async Java Driver in un progetto Play Framework 2, MongoDB Async Java Driver restituisce SingleResponseCallback. Non so come gestire questo tipo di risultato nei controller Play.Come utilizzare il driver Java Async MongoDB nell'azione Play Framework 2.x?

Per esempio come restituire conteggio dalla seguente codice in un controller di gioco:

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

Come posso ottenere il risultato di SingleResultCallback e quindi convertirlo in promessa? è buono? Qual è la migliore pratica in queste situazioni?

risposta

2

Devi risolvere la promessa da solo. Ricorda che le promesse di Play sono wrapper su scala future e che l'unico modo per risolvere un futuro è usare le scale promesse (diverse dalle promesse di gioco) (lo so, è un po 'confuso). Si potrebbe fare qualcosa di simile:

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()); 

Che cosa circa la Promise$.MODULE$.apply() è solo il modo di accedere a oggetti Scala da Java.

+0

Grazie per la risposta. Risolve il mio problema. Aggiungerò una nuova risposta con maggiori dettagli. –

0

Grazie alla risposta @caeus, Si tratta di dettagli:

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

una soluzione più pulita sarebbe quella di utilizzare F.RedeemablePromise<A>.

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())); 
}