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