使用io.smallrye.mutiny.Uni创建响应对象

时间:2020-05-16 05:31:31

标签: rest quarkus smallrye-reactive-messaging

我正在尝试学习在Quarkus框架上使用ReactiveMongoClient。

我以Uni身份发送回复部分成功

@GET
@Path("/unpaginated")
public Uni<List<Staff>> unpaginatedStaffList() {
    return staffService.getStaffResponse();
}

但是,当我尝试获取其他类的对象(StaffResponse)以包含用于分页的Link对象时,我没有得到任何Staff记录。 (目前,我已对分页的链接进行了硬编码)

@GET
@Path("/paginated")
public StaffResponse paginatedStaffList() {
    List<Link> links = LinkService.getLinks("/staff?page=2&limit=20", "next");
    Uni<List<Staff>> staff = (Uni<List<Staff>>) staffService.getStaffResponse();
    return new StaffResponse(links, staff);
}

“工作人员”在响应中为空。

MongoClient正在返回“工作人员确定”的列表,好像Response对象没有获得该列表。 尝试阅读SmallRye Mutiny文档-无法解决。

请帮助。

我已经在以下位置提交了代码:https://github.com/doepradhan/staffApi 和样本json数据文件(https://github.com/doepradhan/staffApi/blob/master/sample-staff-data.json

谢谢您的帮助。

1 个答案:

答案 0 :(得分:3)

您不能混淆两种方法。您需要将Uni用作端点的输出。这意味着您需要将两个输入源都转换为Uni,进行合并,然后映射为StaffResponse

  1. 转换LinkService以返回Uni(或使用Uni.createFrom()。item(links))
  2. 将StaffResoponse更改为仅使用简单对象:
public StaffResponse(List<Link> links, List<Staff> staff) {
        this.links = links;
        this.staff = staff;
    }
  1. 如前所述,获得两个Uni来源并将其组合在一起,您将获得Uni<Tuple>,然后将其映射到StaffResponse
    @GET
    @Path("/paginated")
    public Uni<StaffResponse> paginatedStaffList() {
        final Uni<List<Link>> links =
                Uni.createFrom().item(LinkService.getLinks("/staff?page=2&limit=20", "next"));
        Uni<List<Staff>> staff = staffService.getStaffResponse();
        return staff.and(links).map(it -> new StaffResponse(it.getItem2(), it.getItem1()));
    }

我创建了有效的PR here