我想在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中设置状态代码的正确方法是什么?
答案 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));