2017-10-12 95 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>>我現在有,所以它不會編譯。

我當然可以通過將completionStage放入CompletableFuture並獲取它,但這會使調用同步並迫使我處理InterruptExceptions等等,這對於某些應該是複雜的不重要的。

在Lagom中設置狀態碼的正確方法是什麼?

回答

3

你幾乎已經解決了。而不是創建一個新的completedFuture的,你可以撰寫stage與建立最終的Pair這樣的拉姆達:

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)); 
相關問題