如何将Spring的Page对象转换为自定义PageableResponseModel?
将Spring Data Page转换为自定义PageableResponseModel的实现方案
方案1:直接使用Builder模式构造
利用PageableResponseModel上的@Builder注解,直接从Page对象提取字段完成转换,适合简单场景快速落地:
// 在响应式业务逻辑中处理转换 Uni<PageableResponseModel<T>> fetchPageData(Specification<T> spec, Pageable pageable) { return findAll(spec, pageable) .map(page -> PageableResponseModel.<T>builder() .totalResults(page.getTotalElements()) .page(page.getNumber()) // 注意:Spring Data Page的页码从0开始,若接口需1起始则改为page.getNumber() + 1 .size(page.getSize()) .results(page.getContent()) .build()); }
方案2:封装为工具类复用
如果多个业务场景需要转换,把逻辑抽成静态工具类,提升代码复用性:
public class PageConversionUtils { // 通用转换方法 public static <T> PageableResponseModel<T> convert(Page<T> page) { return PageableResponseModel.<T>builder() .totalResults(page.getTotalElements()) .page(page.getNumber()) .size(page.getSize()) .results(page.getContent()) .build(); } } // 使用示例 Uni<PageableResponseModel<T>> response = findAll(spec, pageable) .map(PageConversionUtils::convert);
方案3:用映射框架自动转换(如MapStruct)
如果项目中使用MapStruct这类映射工具,可以通过定义Mapper接口实现自动转换,减少手动赋值代码:
- 定义Mapper接口:
@Mapper(componentModel = "spring") public interface PageResponseMapper { // 映射字段对应关系:Page的字段 -> PageableResponseModel的字段 @Mapping(source = "totalElements", target = "totalResults") @Mapping(source = "content", target = "results") @Mapping(source = "number", target = "page") <T> PageableResponseModel<T> toPageableResponse(Page<T> page); }
- 在业务代码中注入使用:
@Autowired private PageResponseMapper pageResponseMapper; Uni<PageableResponseModel<T>> response = findAll(spec, pageable) .map(pageResponseMapper::toPageableResponse);
注意事项
- Spring Data的
Page对象页码是0起始,如果你的接口规范要求页码从1开始,需要在转换时对page字段做+1处理。 - 你的
PageableResponseModel中size字段有默认值,但从Page中获取的size是已确定的分页大小,会直接覆盖默认值,无需额外处理。
内容的提问来源于stack exchange,提问作者Jordi
相关产品推荐
相关产品推荐

