You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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接口实现自动转换,减少手动赋值代码:

  1. 定义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);
}
  1. 在业务代码中注入使用:
@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 16:05:48