Вложенные вызовы доступа к данным с помощью Spring WebFlux-Reactor

Я пытаюсь выполнить вложенные вызовы в базу данных, используя spring webflux /actor, чтобы вернуть Mono вложенных объектов (пользователя с его ролями).

Сценарий следующий:

  • получить из базы данных строку пользователя, имеющую имя пользователя;
  • сопоставить пользовательскую строку с User POJO;
  • получать роли пользователя по идентификатору пользователя;
  • сопоставить роли со списком ролей;
  • установите сопоставленные роли на User POJO;
  • вернуть моно пользователя.

Приведенный выше сценарий должен выполняться без блокировки (я знаю, что сопоставление так мало блокирует :)).

public Mono<User> retrieveByUsername(String username)  {
    return databaseClient.execute(usersQueries.getProperty("users.select.by.username"))
            .bind("username", username.toLowerCase())
            .map((row, meta) -> UserRowMapper.mapRow(row, meta))
            // here goes nested database query to retrieve roles and set them to retrieved user 
            // and return Mono<User>
            .one();
}

Спасибо заранее за вашу помощь.


person Walid Ammou    schedule 03.03.2020    source источник
comment
Используйте плоскую карту, а затем сделайте следующий звонок   -  person Toerktumlare    schedule 04.03.2020


Ответы (1)


Вот как я вижу решение вашего вопроса:

public Mono<User> retrieveByUsername(String username) {
    Mono<User> userMono = databaseClient
            .execute(usersQueries.getProperty("users.select.by.username"))
            .<User>map((row, meta) -> UserRowMapper.mapRow(row, meta))
            .one()
            .cache();

    Flux<Role> roles = Mono
            .from(userMono)
            .flatMapMany(user -> databaseClient
                    .execute(usersQueries.getProperty("roles.select.by.user.id"))
                    .bind("userId", user.getId())
                    .<Role>map((row, meta) -> RoleRowMapper.mapRow(row, meta))
                    .all()
            );

    return Mono
            .from(userMono)
            .flatMap(user -> roles
                    .collectList()
                    .map(r -> {
                        user.setRoles(r);
                        return user;
                    })
            );
}
person Stepan Tsybulski    schedule 05.03.2020
comment
Спасибо Степан. Это именно то, что мне нужно. - person Walid Ammou; 07.03.2020
comment
Я рада, что это помогло! - person Stepan Tsybulski; 07.03.2020