如何在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)

2 years ago

你几乎已经解决了 . 而不是创建一个新的 completedFuture ,你可以用一个构建最终 Pair 的lambda组成 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));