2017-10-12 55 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)); 
相关问题