我正在为Pageable Spring数据资源编写客户端java程序 存储库GET API的格式为:
public Page<Person> findByCountry(..., Pageable pageable);
我已经创建了格式为
的可分页请求Pageable pageable = new PageRequest(1, 40, new Sort("name"));
但是,我想知道如何将此可分页设置到我的http client
中。
我使用的是HttpGet
和HttpPost
。
我google了一下,发现大多数链接使用弹簧控制器。我可以不使用apache http客户端吗? Springs hateoas似乎是另一种选择。但这意味着在我的客户端项目中添加另一个jar。这只是如何在请求上设置有效负载的问题吗?
此外,如果有更好的方法,请告诉我。我想循环遍历所有页面,直到数据耗尽。
感谢。
答案 0 :(得分:1)
我不确定我建议的是最好的方法,但这就是我要做的。由于在没有向客户端添加Spring依赖项的情况下,您无法在精简客户端中引用Spring依赖对象(即Pageable),因此您可能希望将PageRequest详细信息作为HTTP GET查询参数发送到HTTP GET API,并将其循环到您的技术独立的pagewrapper结果如下所示。
API签名
public PageWrapper findByCountry(...,int page,int size,String sortBy,String sortDirection);
<强> PageWrapper:强>
List<T> items;
int currentPage;
int totalPages;
int totalItems;
boolean isLast;
API代码:
Pageable nextPageable = new PageRequest(page, size, new Sort(sortBy));
Page<Person> personsPage = countryService.findByCountry(.., nextPageable);
if(null != personsPage){
PageWrapper<Person> pageWrapper = new PageWrapper<>();
pageWrapper.setItems(personsPage.getContent());
pageWrapper.setTotalPages(personsPage.getTotalPages());
pageWrapper.setTotalItems(personsPage.getTotalElements());
pageWrapper.setCurrentPage(personsPage.getNumber())
pageWrapper.setIsLast(personsPage.isLast());
return pageWrapper
}
客户代码:
PageWrapper page = null;
do {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("page", index++);
paramMap.put("size", size);
paramMap.put("sortBy", "name");
page = (PageWrapper) httpClient.get(requestURI, paramMap);
process(page);
}while(!page.getIsLast())
答案 1 :(得分:0)
解决方案结果很简单。 我犯的错误是使用非默认名称设置参数。如果传递正确的参数,Spring的rest api将创建一个可分页的对象(如reference doc for Spring Data Repositories中的'HandlerMethodArgumentResolvers for Pageable and Sort'部分所述)
如果请求具有给定名称(如页面,大小等)的参数,将自动创建Pageable。