如何为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
相关产品推荐
相关产品推荐

