如何 return Uni<Object> 或 Uni<Void>?

How to return either Uni<Object> or Uni<Void>?

@Route(...)
public Uni<?> call() {
    return Uni.createFrom().voidItem();
}

抛出 NullPointerException:无效值 return 由 Uni 编辑:null

然而

@Route(...)
public Uni<Void> call() {
    return Uni.createFrom().voidItem();
}

工作完美并以 HTTP 204 响应

我如何设法从同一方法获取 Uni 或 Uni? 我需要 return http 204 仅在特定情况下

你不能直接这样做,因为类型不同。 我建议使用 RESTEasy Reactive 并执行:

@GET
public Uni<Response> call() {
   Uni<AnyObject> uni = .... ;
   return uni
      .onItem().transform(res -> {
        if (res == null) return Response.noContent().build();
        return Response.ok(res).build();
    });
}

通过发出 Response 对象,您可以自定义响应状态。

如果您想继续使用 Reactive Routes,另一种解决方案是不 return 一个 Uni,而是获取 RoutingContext 作为参数:

@Route(...)
public void call(RoutingContext rc) {
   HttpServerResponse response = rc.response();
   Uni<AnyObject> uni = .... ;
   return uni
      .subscribe().with(res -> {
        if (res == null) response.setStatus(204).end();
        else response.setStatus(200).end(res);
    }, failure -> rc.fail(failure)); // will produce a 500.
}