2017-10-12 8 views
1

Lagomで典型的な残りのPOST呼び出しを実装したいと思います。 POSTはオブジェクトを作成し、ステータスコード201を返します。Lagomサービスコールでステータスコードを返す方法

ただし、デフォルトの戻りコードは200です。ここに示すようにステータスコードを設定することができます(https://www.lagomframework.com/documentation/1.3.x/java/ServiceImplementation.html#Handling-headers)。

しかし、私はもっと複雑な場合にそれを行う方法を理解できません。私の作成は非同期で、Stringの代わりにオブジェクトを返します。

@Override 
public HeaderServiceCall<OrderRequest.CreateOrderRequest, Order> createOrder() { 
    UUID orderId = UUID.randomUUID(); 
    ResponseHeader responseHeader = ResponseHeader.OK.withStatus(201); 

    return (requestHeader, request) -> { 
     CompletionStage<Order> stage = registry.refFor(OrderEntity.class, orderId.toString()) 
       .ask(buildCreateOrder(orderId, request)) 
       .thenApply(reply -> toApi(reply)); 

     return CompletableFuture.completedFuture(Pair.create(responseHeader, stage.toCompletableFuture())); 
    }; 
} 

しかし、戻り値は、私が今持っているPair<ResponseHeader, Order>、ないPair<ResponseHeader, CompletionStage<Order>>する必要があり、それがコンパイルされません:

これは私が持っているコードです。

CompletableFutureにcompletionStageを入れてそれを取得することで、Orderを自分自身で抽出することはできますが、これは呼び出しを同期させ、InterruptExceptionsなどを処理するよう強制します。簡単。

Lagomでステータスコードを設定する正しい方法は何ですか?

答えて

3

ほとんど解決済みです。代わりに新しいcompletedFutureを作成するあなたは、このような最終Pairを構築ラムダとstageを構成することができます:

return stage.thenApply(order -> Pair.create(responseHeader, order)); 

と一緒にすべてのピースを置く:

registry.refFor(OrderEntity.class, orderId.toString()) 
      .ask(buildCreateOrder(orderId, request)) 
      .thenApply(reply -> toApi(reply)); 
      .thenApply(order -> Pair.create(responseHeader, order)); 
関連する問題