spring-boot - 将 Mono 流转换为 Flux
问题描述
我有一个 REST 控制器方法,它通过路径变量接收 ID 列表:
@GetMapping("/api/test/{ids}")
fun findAllByIds(@PathVariable ids: Array<String>) = ...
从存储库中,我想发送一个Flux
基于 id 的匹配对象。做到这一点的基本方法是什么。我可以做一个基于过滤器的操作,findAll()
还是有更好的方法来处理这个?
@GetMapping("/api/test/{ids}")
fun findAllByIds(@PathVariable ids: Array<String>) = service.findAll()
.filter { ids.contains(testObject.id) }
解决方案
到目前为止,最好的方法是向您的数据层添加一个findByIds(...)
方法,这样它就可以在单个查询/请求中返回您需要的值。这几乎肯定会比事后处理数据更有效率。
如果你不能这样做,那么你有两个选择:
- 调用
findById()
一个循环来获得一个List<Mono>
或Mono[]
,然后使用静态Flux.concat()
方法将它变成一个Flux
; - 打电话
findAll()
,然后在你的问题中进行过滤。
如果您必须使用上述方法之一,这取决于您的场景 - 在传入大量 ID 并且返回的完整集findAll()
相对较小的情况下,那么调用findAll()
和过滤可能是最好的。
另一方面,如果传入的ID相对较少,并且完整的数据集很大,那么您最好findById()
在循环中调用。
然而,重申一下 - 上述两种方法都不如在数据层上处理这个问题。
推荐阅读
- firebase - Firebase 数据库安全规则阻止帖子
- java - 如何在 Java 中简化印度地区的字符串?
- angular - 垫选择列表删除突出显示
- sql - 获取分组依据的 SQL 查询
- python - 如何使用 git for Windows 在 Windows 上的 Git Hook 中获取 Python 退出代码
- html - 与具有导航栏和徽标的背景图像重叠的图像
- laravel - 自动完成功能不适用于移动视图
- kubernetes - GKE 上的 kubernetes 外部机密,权限错误
- android - Ktor 客户端的 JsonFeature 未解决
- c# - 如果 JSON Web 令牌(JWT)过期,从 Web 服务抛出错误的标准方法?