1

我是反应式编程的新手。请协助在 Mutiny 中实现以下目标。

我有一个 DTO 课程

public class UserAppSessionDto{
    private UserDto user;
    private List<OrgDto>  userOrgs;
    private List<AppDto> userApps;
}

3种服务方式,一种退货Uni,另一种退货Multi

Uni<UserDto> getUserByOrgUserId(Integer orgUserId);
Multi<AppDto> getUserApps(Integer orgUserId);
Multi<RoleDto> getUserRoles(Integer orgUserId);

我需要编写一个调用上述 3 个方法的服务方法,应用一些业务验证,将返回值设置为一个实例UserAppSessionDto并返回一个Uni<UserAppSessionDto>. 我已经提到了下面要应用的基本业务逻辑(空检查)。

public Uni<UserAppSessionDto> getUserAppSessionDetails(Integer orgUserId)
         {
             UserAppSessionDto user=new UserAppSessionDto();

             //1. call the method Uni<UserDto> getUserByOrgUserId(Integer orgUserId)
             //2. If UserDto (in the returned Uni) is not null, call Multi<AppDto> getUserApps(Integer orgUserId) and Multi<RoleDto> getUserRoles(Integer orgUserId) methods in parallel. 
             //3. Set the return values from the above three methods into user variable
             //4. Return Uni<UserAppSessionDto>

             return Uni.createFrom().item(user);
         }
4

1 回答 1

1

getUserApps有什么理由getUserRoles返回 Multis 吗?我不相信他们会流式传输结果,而是分批返回列表。如果是这样,使用Uni<List<X>更好。

通过此更改,您的逻辑变得更加容易:

public Uni<UserAppSessionDto> getUserAppSessionDetails(Integer orgUserId) {
  UserAppSessionDto user=new UserAppSessionDto();

 Uni<UserDto> uni = getUserByOrgUserId(orgUserId)
       .invoke(userDTO -> user.user = userDTO);
 
return uni
   onItem().ifNotNull().transformToUni(userdto -> 
       Uni.combine().all()
         .unis(getUserApps(orgUserId),getUserRoles(orgUserId))
         .asTuple()
         .invoke((apps, roles) -> user....)
     )
     .map(x -> user);
}
于 2022-02-09T07:46:18.007 回答