Rest 不使用Spring数据的Spring hateoas分页

Rest 不使用Spring数据的Spring hateoas分页,rest,pagination,spring-hateoas,Rest,Pagination,Spring Hateoas,我想为我的RESTAPI实现分页。 该应用程序使用Spring Hateoas 0.8、Spring MVC 3.2.4和Spring Integration 2.2.4。 我看到Spring Hateoas有PagedResources类,但这并没有将结果拆分成页面。 似乎spring数据需要正确创建页面,并正确创建上一个和下一个链接 我尝试过此操作,但链接不正确,所有结果都会显示: @RequestMapping(value = "/resources", method = Requ

我想为我的RESTAPI实现分页。 该应用程序使用Spring Hateoas 0.8、Spring MVC 3.2.4和Spring Integration 2.2.4。 我看到Spring Hateoas有PagedResources类,但这并没有将结果拆分成页面。 似乎spring数据需要正确创建页面,并正确创建上一个和下一个链接

我尝试过此操作,但链接不正确,所有结果都会显示:

    @RequestMapping(value = "/resources", method = RequestMethod.GET, produces="application/json")
public HttpEntity<Resources<RequestResource>> showAllAsResources() {
    Iterable<? extends Request> people = requestAccess.getRequests();
    RequestAssembler assembler = new RequestAssembler();
    List<RequestResource> resources = assembler.toResources(people);
    Resources<RequestResource> wrapped = new Resources<RequestResource>(resources, linkTo(RequestsController.class)
            .withSelfRel());
    return new HttpEntity<Resources<RequestResource>>(wrapped);
}
是否有任何Spring类可以帮助我实现这一点,或者我需要实现自己的分页

非常感谢,, 马丁

更新

使用下面代码中的解决方案会产生下面的响应,尽管我认为这有点过分了。有没有任何Spring助手类可以实现同样的功能

@RequestMapping(value = "/resources1", method = RequestMethod.GET, produces="application/json")
public HttpEntity<PagedResources<Resource<RequestResource>>> viewResources1(Pageable pageable)
{   
    int page = pageable.getPageNumber();
    int count = pageable.getPageSize();
    RequestAssembler requestAssembler = new RequestAssembler();

    List<Request> requests = requestAccess.getRequests2();
    int max = (count*(page+1)>requests.size())? requests.size(): count*(page+1);

    Page<Request> pageRequests = new PageImpl<Request>(requests.subList(page*count, max), pageable, requests.size());

    return new ResponseEntity<PagedResources<Resource<RequestResource>>>(pagedResourcesAssembler.toResource(pageRequests, requestAssembler), HttpStatus.OK);
}

    {
"links": [
{
"rel": "next",
"href": "http://lwss:9084/lerest/v1/resources1?page=4&size=20"
},
{
"rel": "prev",
"href": "http://lwss:9084/lerest/v1/resources1?page=2&size=20"
}
],
"content": [
{
"givenName": "Joe",
"familyName": "Bloggs161",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/161"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs162",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/162"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs163",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/163"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs164",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/164"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs165",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/165"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs166",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/166"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs167",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/167"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs168",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/168"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs169",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/169"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs170",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/170"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs171",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/171"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs172",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/172"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs173",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/173"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs174",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/174"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs175",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/175"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs176",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/176"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs177",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/177"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs178",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/178"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs179",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/179"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs180",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/180"
}
]
}
],
"page": {
"size": 20,
"totalElements": 100,
"totalPages": 5,
"number": 3
}
}
@RequestMapping(value=“/resources1”,method=RequestMethod.GET,products=“application/json”)
公共HttpEntity视图资源1(可分页)
{   
int page=pageable.getPageNumber();
int count=pageable.getPageSize();
RequestAssembler RequestAssembler=新的RequestAssembler();
List requests=requestAccess.getRequests2();
int max=(count*(第+1页)>requests.size())?requests.size():count*(第+1页);
Page pageRequests=new PageImpl(requests.subList(Page*count,max),pageable,requests.size());
返回新的ResponseEntity(pagedResourcesAssembler.toResource(pageRequests,requestAssembler),HttpStatus.OK);
}
{
“链接”:[
{
“rel”:“下一步”,
“href”:”http://lwss:9084/lerest/v1/resources1?page=4&size=20"
},
{
“rel”:“prev”,
“href”:”http://lwss:9084/lerest/v1/resources1?page=2&size=20"
}
],
“内容”:[
{
“吉文纳姆”:“乔”,
“familyName”:“Bloggs161”,
“链接”:[
{
“rel”:“self”,
“href”:”http://lwss:9084/lerest/v1/161"
}
]
},
{
“吉文纳姆”:“乔”,
“familyName”:“Bloggs162”,
“链接”:[
{
“rel”:“self”,
“href”:”http://lwss:9084/lerest/v1/162"
}
]
},
{
“吉文纳姆”:“乔”,
“familyName”:“Bloggs163”,
“链接”:[
{
“rel”:“self”,
“href”:”http://lwss:9084/lerest/v1/163"
}
]
},
{
“吉文纳姆”:“乔”,
“familyName”:“Bloggs164”,
“链接”:[
{
“rel”:“self”,
“href”:”http://lwss:9084/lerest/v1/164"
}
]
},
{
“吉文纳姆”:“乔”,
“familyName”:“Bloggs165”,
“链接”:[
{
“rel”:“self”,
“href”:”http://lwss:9084/lerest/v1/165"
}
]
},
{
“吉文纳姆”:“乔”,
“familyName”:“Bloggs166”,
“链接”:[
{
“rel”:“self”,
“href”:”http://lwss:9084/lerest/v1/166"
}
]
},
{
“吉文纳姆”:“乔”,
“familyName”:“Bloggs167”,
“链接”:[
{
“rel”:“self”,
“href”:”http://lwss:9084/lerest/v1/167"
}
]
},
{
“吉文纳姆”:“乔”,
“familyName”:“Bloggs168”,
“链接”:[
{
“rel”:“self”,
“href”:”http://lwss:9084/lerest/v1/168"
}
]
},
{
“吉文纳姆”:“乔”,
“familyName”:“Bloggs169”,
“链接”:[
{
“rel”:“self”,
“href”:”http://lwss:9084/lerest/v1/169"
}
]
},
{
“吉文纳姆”:“乔”,
“familyName”:“Bloggs170”,
“链接”:[
{
“rel”:“self”,
“href”:”http://lwss:9084/lerest/v1/170"
}
]
},
{
“吉文纳姆”:“乔”,
“familyName”:“Bloggs171”,
“链接”:[
{
“rel”:“self”,
“href”:”http://lwss:9084/lerest/v1/171"
}
]
},
{
“吉文纳姆”:“乔”,
“familyName”:“Bloggs172”,
“链接”:[
{
“rel”:“self”,
“href”:”http://lwss:9084/lerest/v1/172"
}
]
},
{
“吉文纳姆”:“乔”,
“familyName”:“Bloggs173”,
“链接”:[
{
“rel”:“self”,
“href”:”http://lwss:9084/lerest/v1/173"
}
]
},
{
“吉文纳姆”:“乔”,
“familyName”:“Bloggs174”,
“链接”:[
{
“rel”:“self”,
“href”:”http://lwss:9084/lerest/v1/174"
}
]
},
{
“吉文纳姆”:“乔”,
“familyName”:“Bloggs175”,
“链接”:[
{
“rel”:“self”,
“href”:”http://lwss:9084/lerest/v1/175"
}
]
},
{
“吉文纳姆”:“乔”,
“familyName”:“Bloggs176”,
“链接”:[
{
“rel”:“self”,
“href”:”http://lwss:9084/lerest/v1/176"
}
]
},
{
“吉文纳姆”:“乔”,
“familyName”:“Bloggs177”,
“链接”:[
{
“rel”:“self”,
“href”:”http://lwss:9084/lerest/v1/177"
}
]
},
{
“吉文纳姆”:“乔”,
“familyName”:“Bloggs178”,
“链接”:[
{
“rel”:“self”,
“href”:”http://lwss:9084/lerest/v1/178"
}
]
},
{
“吉文纳姆”:“乔”,
“familyName”:“Bloggs179”,
“链接”:[
{
“rel”:“self”,
“href”:”http://lwss:9084/lerest/v1/179"
}
]
},
{
“吉文纳姆”:“乔”,
“familyName”:“Bloggs180”,
“链接”:[
{
“rel”:“self”,
“href”:”http://lwss:9084/lerest/v1/180"
}
]
}
],
“第页”:{
“尺寸”:20,
“总元素”:100,
“总页数”:5页,
“数字”:3
}
}

听起来您想利用
spring data rest的优点,而不需要真正的存储库“支持”。这就是这个问题的内容:不完全是,我已经在使用SpringHateOAS,并且有一个SpringIntegration的项目列表。我只是想把这些“转换”成分页对象。可能吗?也许我不理解这个问题,但看起来您正在将所有数据发送到客户端,现在您想知道为什么所有数据都发送到客户端。我显然没有正确使用分页类。他们能够在客户端上正确显示元数据和链接,但所有数据都会被发送,而不是某个特定页面的数据。这有意义吗?页面类型应该包含所有数据还是只包含数据的一部分,即页面大小为5-是否只有5项?
{
"links": [
{
"rel": "next",
"href": "http://lwss:9084/lerest/v1/resources2?page=2&size=5"
},
{
"rel": "prev",
"href": "http://lwss:9084/lerest/v1/resources2?page=0&size=5"
}
],
"content": [
{
"givenName": "Joe",
"familyName": "Bloggs101",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/101"
}
]
},
...
{
"givenName": "Joe",
"familyName": "Bloggs200",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/101"
}
]
},
]
}
],
"page": {
"size": 5,
"totalElements": 100,
"totalPages": 20,
"number": 1
}
}
@RequestMapping(value = "/resources1", method = RequestMethod.GET, produces="application/json")
public HttpEntity<PagedResources<Resource<RequestResource>>> viewResources1(Pageable pageable)
{   
    int page = pageable.getPageNumber();
    int count = pageable.getPageSize();
    RequestAssembler requestAssembler = new RequestAssembler();

    List<Request> requests = requestAccess.getRequests2();
    int max = (count*(page+1)>requests.size())? requests.size(): count*(page+1);

    Page<Request> pageRequests = new PageImpl<Request>(requests.subList(page*count, max), pageable, requests.size());

    return new ResponseEntity<PagedResources<Resource<RequestResource>>>(pagedResourcesAssembler.toResource(pageRequests, requestAssembler), HttpStatus.OK);
}

    {
"links": [
{
"rel": "next",
"href": "http://lwss:9084/lerest/v1/resources1?page=4&size=20"
},
{
"rel": "prev",
"href": "http://lwss:9084/lerest/v1/resources1?page=2&size=20"
}
],
"content": [
{
"givenName": "Joe",
"familyName": "Bloggs161",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/161"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs162",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/162"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs163",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/163"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs164",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/164"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs165",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/165"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs166",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/166"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs167",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/167"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs168",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/168"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs169",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/169"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs170",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/170"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs171",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/171"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs172",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/172"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs173",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/173"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs174",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/174"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs175",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/175"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs176",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/176"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs177",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/177"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs178",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/178"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs179",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/179"
}
]
},
{
"givenName": "Joe",
"familyName": "Bloggs180",
"links": [
{
"rel": "self",
"href": "http://lwss:9084/lerest/v1/180"
}
]
}
],
"page": {
"size": 20,
"totalElements": 100,
"totalPages": 5,
"number": 3
}
}