我希望在多个 Spring 微服务 API 的大量端点上实现基于游标的分页。 我正在寻找一个依赖项,我可以以与默认情况下在 spring-boot 中处理偏移分页相同或相似的方式注入和实现。
换句话说:
Spring 内置了使用偏移分页的处理:
public Page<SomeDTO> nextPage(@PageableDefault(size = 5, sort = "createdAt", direction = Sort.Direction.DESC) Pageable pageable,
@ApiParam(name = "tabFilter") @RequestParam(value = "tabFilter", required = false, defaultValue = "CREATED_BY_ME") String tabFilter,
@ApiParam(name = "status") @RequestParam(value = "status", required = false) String status,
...){
但我需要一种类似的方法来跨类标准化它(最好不要构建自定义 DTO/注释。
Java 8
Spring启动2.4.2
春天 5.3.3
有点晚了,但终于有一个了:https://github.com/p3t/spring-cursorpaging
它支持使用任意顺序/过滤器设置以及自定义标准查询过滤器构建
PageRequest
。
示例:
public void queryData() {
final PageRequest<DataRecord> request = PageRequest.create( b -> b.pageSize( 5 )
.desc( Attribute.path( DataRecord_.auditInfo, AuditInfo_.createdAt ) )
.asc( Attribute.path( DataRecord_.auditInfo, AuditInfo_.modifiedAt ) )
.asc( DataRecord_.id ) );
final Page<DataRecord> page = dataRecordRepository.findPage( request );
page.forEach( System.out::println );
}
为了设计您的 API,支持游标的序列化和加密。
// from base64 string:
final PageRequest<DataRecord> request = cursor.map( serializer::toPageRequest )
.orElseGet( () -> PageRequest.create( b -> b.asc( DataRecord_.name ).asc( DataRecord_.id ) ) )
.withPageSize( pageSize.orElse( 10 ) );
// to base64 string
private Link getLink( final Optional<Integer> pageSize, final PageRequest<DataRecord> request,
final LinkRelation rel ) {
return linkTo( methodOn( DataRecordController.class ).getDataRecordPage( pageSize,
Optional.of( serializer.toBase64( request ) ) ) ).withRel( rel ).expand();
}
对于如何设计 API 的方式没有限制(传递初始过滤器/顺序参数,以及如何返回链接 - 我仍然建议使用 Spring 的 Hateos 支持。
可以在这里找到完整的示例Web应用程序:https://github.com/p3t/spring-cursorpaging/tree/main/cursorpaging-examples/webapp-with-maven