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

如何为Spring Boot的Page<>接口创建DTO以剔除冗余JSON字段?

解决Spring Boot分页接口返回冗余字段的问题

这个问题我之前做项目时也碰到过——Spring Data的Page对象序列化后会自带一堆前端用不上的冗余字段(比如pageable、sort、numberOfElements这类),要去掉这些字段,最稳妥的方式是用自定义分页DTO来封装你需要的信息,而不是直接返回Page<DrinkDTO>。下面给你具体的实现方案:

方案一:创建通用分页响应DTO(推荐,可复用)

先定义一个泛型的分页DTO,只保留你需要的分页元数据和内容列表:

public class PageResponseDTO<T> {
    // 核心数据:转换后的DTO列表
    private List<T> content;
    // 分页元数据(按需选择,比如下面这些是常用的)
    private long totalElements; // 总数据条数
    private int totalPages;     // 总页数
    private int size;           // 当前页条数
    private int number;         // 当前页号(从0开始)

    // 构造函数:直接从Spring Page对象提取需要的字段
    public PageResponseDTO(Page<T> page) {
        this.content = page.getContent();
        this.totalElements = page.getTotalElements();
        this.totalPages = page.getTotalPages();
        this.size = page.getSize();
        this.number = page.getNumber();
    }

    // 自动生成getter、setter(或者用Lombok的@Data注解)
}

然后修改你的Service方法,用Page自带的map方法把Drink转换为DrinkDTO,再封装到自定义DTO中:

public PageResponseDTO<DrinkDTO> getAllDrinks(int page, int pageSize) { 
    PageRequest pageRequest = PageRequest.of(page, pageSize, Sort.by("id")); 
    final Page<Drink> drinks = drinkRepository.findAll(pageRequest); 
    // 用Page.map快速转换每个Drink到DrinkDTO,比自己写整个Page的转换方法更简洁
    Page<DrinkDTO> drinkDTOPage = drinks.map(drinkMapper::drinkToDrinkDTO);
    // 封装成自定义分页DTO返回
    return new PageResponseDTO<>(drinkDTOPage);
}

方案二:针对特定业务的分页DTO(适合单一场景)

如果不需要通用的分页DTO,也可以写一个专门的饮品分页响应类:

public class DrinkPageResponse {
    private List<DrinkDTO> drinks;
    private long totalCount;
    private int totalPages;
    private int currentPage;

    // 构造函数、getter、setter
    public DrinkPageResponse(Page<DrinkDTO> drinkDTOPage) {
        this.drinks = drinkDTOPage.getContent();
        this.totalCount = drinkDTOPage.getTotalElements();
        this.totalPages = drinkDTOPage.getTotalPages();
        this.currentPage = drinkDTOPage.getNumber() + 1; // 可以把页号转成从1开始,更符合前端习惯
    }
}

对应的Service方法修改为返回这个类即可。

为什么不直接修改Page的序列化?

虽然可以通过Jackson的注解(比如@JsonIgnore)忽略Page的冗余字段,但这种方式不够灵活——不同接口可能需要不同的分页元数据,而且直接修改Spring自带类的序列化规则,容易引发其他问题。自定义DTO的方式更清晰,也能完全控制返回的字段。

最后提醒一下:Controller层直接返回这个自定义DTO,序列化后的JSON就只会包含你定义的字段,冗余信息就都消失啦~

内容的提问来源于stack exchange,提问作者Artur Vartanyan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 16:17:49