如何在Lagom服务调用中返回状态代码

时间:2017-10-12 09:32:56

标签: java lagom

我想在Lagom中实现典型的休息POST调用。 POST创建一个对象,并返回它,状态代码为201。

但是,默认返回码是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并获取它来自己提取Order,但这会使调用同步并迫使我处理InterruptExceptions等,这对于一些应该是微不足道的事情来说似乎有点复杂

在Lagom中设置状态代码的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

You almost have it solved. Instead of creating a new completedFuture you could compose stage with a lambda that builds the final Pair like this:

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

And putting all the pieces together:

registry.refFor(OrderEntity.class, orderId.toString())
            .ask(buildCreateOrder(orderId, request))
            .thenApply( reply -> toApi(reply)); 
            .thenApply( order -> Pair.create(responseHeader, order));