spring-data - 使用 spring webflux-reactor 进行嵌套数据访问调用
问题描述
我正在尝试使用 spring webflux/reactor 对数据库进行嵌套调用,以返回嵌套对象的 Mono(具有他的角色的用户)。
场景如下:
- 从数据库中检索具有用户名的用户行;
- 将用户行映射到用户 POJO;
- 通过用户 id 检索用户的角色;
- 将角色映射到角色列表;
- 将映射的角色设置为用户 POJO;
- 返回用户的 Mono。
上面的场景必须在没有阻塞的情况下完成(我知道映射是一个很小的阻塞:))。
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;
})
);
}
推荐阅读
- python - 将字符串转换为不带日期的 pandas 时间戳
- computer-vision - 是否有任何现有模型可以帮助从游戏视频中提取投篮图表数据?
- swift - Swift 无法访问其他应用程序窗口
- python-3.x - 如何为傅里叶域中的长信号实现 Pytorch 1D 互相关?
- flutter - How to create sticky shop button animation in Flutter?
- javascript - 在 JavaScript 中更改图像标签中的 url
- python - 将 CSV 数据从文件转换为 JSON
- html - CSS“背景图片:url(...)”在我的网站上不起作用
- node.js - Lodash _.merge 函数不会用更新的信息覆盖属性
- python-3.x - 数据框中的美国街道地址搜索