如何 return Lagom 服务调用中的状态代码

How to return a status code in a Lagom Service call

我想在 Lagom 中实现典型的 rest POST 调用。 POST 创建一个对象,并 return 发送它,状态代码为 201。

但是,默认的 return 代码是 200。可以设置状态代码,如下所示 (https://www.lagomframework.com/documentation/1.3.x/java/ServiceImplementation.html#Handling-headers)。

但是,对于更复杂的情况,我不知道该怎么做。我的创建是异步的,我 return 一个对象而不是一个字符串。

这是我的代码:

    @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()));
    };
}

然而,return 值应该是 Pair<ResponseHeader, Order>,而不是我现在的 Pair<ResponseHeader, CompletionStage<Order>>,所以它无法编译。

我当然可以自己提取订单,方法是将 completionStage 放入 CompletableFuture 并获取它,但这会使调用同步并迫使我处理 InterruptExceptions 等,这对于应该处理的事情来说似乎有点复杂是微不足道的。

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

你几乎已经解决了。您可以使用构建最终 Pair 的 lambda 组合 stage,而不是创建新的 completedFuture

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));