1

我有端点,它可以返回同步和异步结果

@POST
@Path("/create-account")
public CompletionStage<Response> createAccount(...) {

   if (preconditions) {
       return myAsyncFunction(...);
   }
   else {
       // how to return error immediately???
       return Response.status(Response.Status.BAD_REQUEST).build(); // incorrect return type
   }

}

如何故意返回一些东西,即同步?

4

2 回答 2

2

CompletionStage是一个接口,它对可能的异步计算阶段进行建模,在另一个 CompletionStage 完成时执行操作或计算值。

所以它可以是同步或异步操作的结果。

这是一个实现接口CompletableFuture的 JRE 类。CompletionStage您可以创建并返回一个 completed CompletableFuture,它使用CompletableFuture.completedFuture静态方法实现CompletionStage 。

 return CompletableFuture.completedFuture(Response.status(Response.Status.BAD_REQUEST).build())

返回的结果将与提供的响应一起完成。

于 2021-04-30T14:14:47.830 回答
1

当您将此标记为叛变时。我假设 async 函数是 uni 或 multy。如果您使用 restaesy-mutiny,您只需返回 mutly/uni 本身,如指南中所述:https ://quarkus.io/guides/getting-started-reactive

 @GET
@Path("{id}")
public Uni<Response> getSingle(Long id) {
    return Fruit.findById(client, id)
            .onItem().transform(fruit -> fruit != null ? Response.ok(fruit) : Response.status(Status.NOT_FOUND))
            .onItem().transform(ResponseBuilder::build);
}

要处理前置条件,您可以使用响应本身创建一个 uni。就像是:

Uni.createFrom()
            .item(Response.status(Response.Status.BAD_REQUEST).build())

最好是查看 Mutiny 指南本身: https ://smallrye.io/smallrye-mutiny/guides 了解如何处理错误等。

于 2021-05-05T08:37:12.397 回答