WebFlux - как использовать Flux <GroupTreeItem>как параметр List <GroupTreeItem>в методе обслуживания - PullRequest
0 голосов
/ 06 мая 2020

Я использую Spring Boot и Webflux. Интересно, как использовать мои allUserGroups:

             public Mono<ResponseEntity<Flux<GroupTreeItem>>> userAllTreeGroups(
 //1
                 Flux<UUID> groupIds = userGroupService
    .findUserGroupByEmail(email)
    .flatMap(groupById -> userGroupService.findUserTreeGroup(groupById.getId(), email))
    .map(GroupTreeItem::getId);

    //2
             rolePrivilegesService
                    .filterGroupIdsForUserPrivilege(Arrays.asList(allUserGroups?????????), "group.permission.all")
                    .flatMap(filteredGroupId -> userGroupService.findUserTreeGroup(filteredGroupId, email))
                    .map(ResponseEntity::ok)
                    .defaultIfEmpty(ResponseEntity.notFound().build());
        }

, где:

 public Mono<List<UUID>> filterGroupIdsForUserPrivilege(List<UUID> groupIds, String privilege) 

и

public class GroupTreeItem   {
  @JsonProperty("id")
  private UUID id;
...
...}

RECAP: моя проблема в том, как передать

Flux<UUID> groupIds

в:

rolePrivilegesService
                    .filterGroupIdsForUserPrivilege(myListOfUUID, "group.permission.all")

А вот тело

userGroupService.findUserTreeGroup:

 public Mono<GroupTreeItem> findUserTreeGroup(UUID groupId, String email) {
    return groupByIdRepo.findById(groupId).flatMap(group -> findAndPopulateChildData(email, group));
      }

Как этого добиться в Webflux без разрыва цепочки в качестве неблокирующей операции?

1 Ответ

2 голосов
/ 06 мая 2020

Как упоминалось K.Nicholas в комментарии, вам нужно преобразовать Flux в Mono> с помощью операции Flux::collectToList и распространить ваш список в цепочке следующим образом:

userGroupService
    .findUserGroupByEmail(email)
    .flatMap(groupById -> userGroupService.findUserTreeGroup(groupById.getId(), email))
    .map(GroupTreeItem::getId)
    .collectToList()
    .flatMap(myListOfUUID -> rolePrivilegesService.filterGroupIdsForUserPrivilege(myListOfUUID, "group.permission.all"))
    .flatMapMany(Flux::fromIterable)  
    .flatMap(filteredGroupId -> userGroupService.findUserTreeGroup(filteredGroupId, email))
    .map(ResponseEntity::ok)
    .defaultIfEmpty(ResponseEntity.notFound().build());

if вам нужно преобразовать Mono> в Flux, используйте .flatMapMany(Flux::fromIterable), но лучше изменить метод rolePrivilegesService.filterGroupIdsForUserPrivilege, чтобы вернуть Flux

...