使用spring-webflux reactor进行嵌套数据访问调用



我正在尝试使用spring-webflux/reactor对数据库进行嵌套调用,以返回嵌套对象的Mono(具有其角色的用户(。

场景如下:

  • 从数据库中检索具有用户名的用户行
  • 将用户行映射到用户POJO
  • 通过用户id检索用户的角色
  • 将角色映射到角色列表
  • 将映射的角色设置为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();
}

提前感谢您的帮助。

以下是我如何看待您的问题的解决方案:

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;
})
);
}

最新更新