Spring HATEOAS 构建 link 到分页资源
Spring HATEOAS build link to paged resource
我有一个带有方法的控制器,returns PagedResource,看起来像这样:
@RequestMapping(value = "search/within", method = RequestMethod.POST)
public @ResponseBody PagedResources within(@RequestBody GeoJsonBody body,
Pageable pageable, PersistentEntityResourceAssembler asm) {
// GET PAGE
return pagedResourcesAssembler.toResource(page, asm);
}
现在,我想将该方法作为 link 添加到根资源中,因此我执行以下操作:
public RepositoryLinksResource process(RepositoryLinksResource repositoryLinksResource) {
repositoryLinksResource.add(linkTo(methodOn(ShipController.class).within(null, null, null)).withRel("within"));
return repositoryLinksResource;
}
有效,我得到了我的 link,但是它添加了没有分页参数的 link。所以它看起来像这样:
"within": {
"href": "http://127.0.0.1:5000/search/within"
},
我想把它变成:
"within": {
"href": "http://127.0.0.1:5000/search/within{?page, size}"
},
This previous question on Whosebug suggests that after fixing the corresponding issue on GitHub 默认情况下它应该可以工作,但是它没有。
我做错了什么?
使用 PagedResourcesAssembler
自动创建分页 Link
我成功使用了 PagedResourcesAssembler
。假设您的实体被称为
MyEntity
。您的 within
方法应该 return HttpEntity<PagedResources<MyEntity>>
。
您的 within
方法应该类似于下面显示的示例。
@RequestMapping(value = "search/within", method = RequestMethod.POST)
@ResponseBody
public HttpEntity<PagedResources<MyEntity>>
within(@RequestBody GeoJsonBody body,Pageable pageable,
PagedResourcesAssembler assembler) {
// GET PAGE
Page<MyEntity> page = callToSomeMethod(pageable);
return new ResponseEntity<>(assembler.toResource(page), HttpStatus.OK);
}
Here 是一个简单的例子。在此示例中,响应如下所示,
{
"_embedded": {
"bookList": [
{
"id": "df3372ef-a0a2-4569-982a-78c708d1f609",
"title": "Tales of Terror",
"author": "Edgar Allan Poe"
}
]
},
"_links": {
"self": {
"href": "http://localhost:8080/books?page=0&size=20"
}
},
"page": {
"size": 20,
"totalElements": 1,
"totalPages": 1,
"number": 0
}
}
手动创建分页自我Link
如果您有兴趣手动创建分页 link,可以使用以下代码片段,
Page<MyEntity> page = callToSomeMethod(pageable);
ControllerLinkBuilder ctrlBldr =
linkTo(methodOn(ShipController.class).within(body, pageable, asm));
UriComponentsBuilder builder = ctrlBldr.toUriComponentsBuilder();
int pageNumber = page.getPageable().getPageNumber();
int pageSize = page.getPageable().getPageSize();
int maxPageSize = 2000;
builder.replaceQueryParam("page", pageNumber);
builder.replaceQueryParam("size", pageSize <= maxPageSize ?
page.getPageable().getPageSize() : maxPageSize);
Link selfLink =
new Link(new UriTemplate(builder.build().toString()), "self");
我有一个带有方法的控制器,returns PagedResource,看起来像这样:
@RequestMapping(value = "search/within", method = RequestMethod.POST)
public @ResponseBody PagedResources within(@RequestBody GeoJsonBody body,
Pageable pageable, PersistentEntityResourceAssembler asm) {
// GET PAGE
return pagedResourcesAssembler.toResource(page, asm);
}
现在,我想将该方法作为 link 添加到根资源中,因此我执行以下操作:
public RepositoryLinksResource process(RepositoryLinksResource repositoryLinksResource) {
repositoryLinksResource.add(linkTo(methodOn(ShipController.class).within(null, null, null)).withRel("within"));
return repositoryLinksResource;
}
有效,我得到了我的 link,但是它添加了没有分页参数的 link。所以它看起来像这样:
"within": {
"href": "http://127.0.0.1:5000/search/within"
},
我想把它变成:
"within": {
"href": "http://127.0.0.1:5000/search/within{?page, size}"
},
This previous question on Whosebug suggests that after fixing the corresponding issue on GitHub 默认情况下它应该可以工作,但是它没有。
我做错了什么?
使用 PagedResourcesAssembler
自动创建分页 Link我成功使用了 PagedResourcesAssembler
。假设您的实体被称为
MyEntity
。您的 within
方法应该 return HttpEntity<PagedResources<MyEntity>>
。
您的 within
方法应该类似于下面显示的示例。
@RequestMapping(value = "search/within", method = RequestMethod.POST)
@ResponseBody
public HttpEntity<PagedResources<MyEntity>>
within(@RequestBody GeoJsonBody body,Pageable pageable,
PagedResourcesAssembler assembler) {
// GET PAGE
Page<MyEntity> page = callToSomeMethod(pageable);
return new ResponseEntity<>(assembler.toResource(page), HttpStatus.OK);
}
Here 是一个简单的例子。在此示例中,响应如下所示,
{
"_embedded": {
"bookList": [
{
"id": "df3372ef-a0a2-4569-982a-78c708d1f609",
"title": "Tales of Terror",
"author": "Edgar Allan Poe"
}
]
},
"_links": {
"self": {
"href": "http://localhost:8080/books?page=0&size=20"
}
},
"page": {
"size": 20,
"totalElements": 1,
"totalPages": 1,
"number": 0
}
}
手动创建分页自我Link
如果您有兴趣手动创建分页 link,可以使用以下代码片段,
Page<MyEntity> page = callToSomeMethod(pageable);
ControllerLinkBuilder ctrlBldr =
linkTo(methodOn(ShipController.class).within(body, pageable, asm));
UriComponentsBuilder builder = ctrlBldr.toUriComponentsBuilder();
int pageNumber = page.getPageable().getPageNumber();
int pageSize = page.getPageable().getPageSize();
int maxPageSize = 2000;
builder.replaceQueryParam("page", pageNumber);
builder.replaceQueryParam("size", pageSize <= maxPageSize ?
page.getPageable().getPageSize() : maxPageSize);
Link selfLink =
new Link(new UriTemplate(builder.build().toString()), "self");