无Spring Data依赖的微服务如何通过RestTemplate获取Page类型数据?
解决方案
因为调用方未引入Spring Data依赖,无法直接使用Spring Data的Page类型,你可以通过以下方式处理:
1. 自定义与Spring Data Page结构一致的DTO类
Spring Data的Page序列化后的JSON结构通常包含核心字段:content(数据列表)、number(当前页码,从0开始)、size(每页条数)、totalElements(总数据量)、totalPages(总页数)、last(是否为最后一页)。你需要在调用方项目中定义一个结构匹配的DTO类,无需依赖Spring Data:
import java.util.List; public class PageDTO<T> { private List<T> content; private int number; private int size; private long totalElements; private int totalPages; private boolean last; // 生成getter、setter方法,或使用Lombok的@Data注解简化 public List<T> getContent() { return content; } public void setContent(List<T> content) { this.content = content; } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } public int getSize() { return size; } public void setSize(int size) { this.size = size; } public long getTotalElements() { return totalElements; } public void setTotalElements(long totalElements) { this.totalElements = totalElements; } public int getTotalPages() { return totalPages; } public void setTotalPages(int totalPages) { this.totalPages = totalPages; } public boolean isLast() { return last; } public void setLast(boolean last) { this.last = last; } }
2. 修改RestTemplate调用代码
将原代码中的Page<MyOwnType>替换为自定义的PageDTO<MyOwnType>,确保反序列化正常:
ResponseEntity<PageDTO<MyOwnType>> response = restTemplate.exchange( myurl, HttpMethod.GET, null, new ParameterizedTypeReference<PageDTO<MyOwnType>>() {} );
3. 实现分页循环获取所有数据
基于PageDTO的last字段或number与totalPages的关系,循环请求直到获取全部数据:
List<MyOwnType> allData = new ArrayList<>(); int currentPage = 0; int pageSize = 10; // 与提供方接口的分页参数保持一致 while (true) { // 构造带分页参数的URL,示例参数为page和size,需匹配提供方接口定义 String url = String.format("%s?page=%d&size=%d", baseUrl, currentPage, pageSize); ResponseEntity<PageDTO<MyOwnType>> response = restTemplate.exchange( url, HttpMethod.GET, null, new ParameterizedTypeReference<PageDTO<MyOwnType>>() {} ); PageDTO<MyOwnType> page = response.getBody(); if (page == null || page.getContent().isEmpty()) { break; } allData.addAll(page.getContent()); if (page.isLast()) { break; } currentPage++; }
注意事项
- 确保
MyOwnType类的字段与提供方接口返回的JSON字段匹配,可通过@JsonProperty注解调整字段映射关系。 - 如果提供方接口的分页参数(如页码起始值、参数名称)有差异,需同步调整URL中的参数配置。
内容的提问来源于stack exchange,提问作者Hubert Bratek
相关产品推荐
相关产品推荐

