我们正在构建一个简单的API,以使用如下的分页来获取属于给定 Foo 的 Bar :
GET /foo/1/bar?pageSize=50&pageOffset=1
在后端,我们使用Spring Data JPA分页支持,如:
Page<Bar> barsPage = repo.findBarsForFoo(fooId, new PageRequest(pageOffset, pageSize));
我们需要过滤掉barPage中的某些元素 - 简单,如:
List<Bar> filtered = barsFilter.removeSome(barsPage.getContent())
将组件委托过滤到其他服务(让我们称之为拒绝者):
class BarsFilter {
@Autowired Rejector1 rejector1;
@Autowired Rejector2 rejector2;
public List<Bar> filterSome(List<Bar> bars) {
return bars.stream()
.filter(bar -> rejector1.matches(bar))
.filter(bar -> rejector2.matches(bar))
.collect(toList());
}
}
问题是,API客户端将获得比项目要求更少的项目。
过滤逻辑很复杂,它依赖于其他组件。它不能写为单个数据库查询。
这里最合理的事情是什么?返回一个较小的页面?人为地增加页面大小?利用一些Spring Data或JPA机制来支持这种自定义逻辑?
答案 0 :(得分:1)
在我看来,它的发布取决于你将通过这个API发送的内容。
案例1: 您想获取通知列表 - &gt;在删除其中一些列表之后,只需返回较小的列表,就不会影响用户体验。
案例2: 您希望获得特定国家/地区的20个用户的排名,这就是您删除其中一些用户的原因。那么你真的需要返回20个用户,所以最好实现一些自定义逻辑。人为增加的页面声音根本没有效率。
希望有所帮助。