在 Spring HATEOAS 和 Spring Data Commons 中支持这样的场景。 Spring HATEOAS 附带了一个 PageMetadata 对象,该对象本质上包含与 Page 相同的数据,但执行方式较少,因此可以更轻松地编组和解组。
我们结合 Spring HATEOAS 和 Spring Data commons 实现此功能的另一个原因是,简单地编组页面、内容和元数据没有什么价值,但还希望生成可能存在的下一页或上一页的链接,因此客户端不必自己构造 URI 来遍历这些页面。
一个例子
假设一个域类Person:
class Person {
Long id;
String firstname, lastname;
}
以及它对应的仓库:
interface PersonRepository extends PagingAndSortingRepository<Person, Long> { }
您现在可以按如下方式公开 Spring MVC 控制器:
@Controller
class PersonController {
@Autowired PersonRepository repository;
@RequestMapping(value = "/persons", method = RequestMethod.GET)
HttpEntity<PagedResources<Person>> persons(Pageable pageable,
PagedResourcesAssembler assembler) {
Page<Person> persons = repository.findAll(pageable);
return new ResponseEntity<>(assembler.toResources(persons), HttpStatus.OK);
}
}
这里可能有很多需要解释的地方。让我们一步一步来:
- 我们有一个 Spring MVC 控制器将存储库连接到其中。这需要设置 Spring Data(通过
@Enable(Jpa|Mongo|Neo4j|Gemfire)Repositories 或 XML 等效项)。控制器方法映射到/persons,这意味着它将接受对该方法的所有GET 请求。
- 从该方法返回的核心类型是
PagedResources - Spring HATEOAS 中的一种类型,它表示一些用Links 和PageMetadata 丰富的内容。
-
当方法被调用时,Spring MVC 必须为Pageable 和PagedResourcesAssembler 创建实例。要使其正常工作,您需要通过即将在 Spring Data Commons 的即将到来的里程碑中引入的 @EnableSpringDataWebSupport 注释或通过独立的 bean 定义(记录在 here)来启用 Spring Data Web 支持。
Pageable 将填充来自请求的信息。默认配置会将?page=0&size=10 变成Pageable,请求第一个页面大小为10。
PageableResourcesAssembler 允许您轻松地将Page 转换为PagedResources 实例。它不仅会将页面元数据添加到响应中,还会根据您访问的页面以及Pageable 分辨率的配置方式将适当的链接添加到表示中。
为 JPA 启用此功能的示例 JavaConfig 配置如下所示:
@Configuration
@EnableWebMvc
@EnableSpringDataWebSupport
@EnableJpaRepositories
class ApplicationConfig {
// declare infrastructure components like EntityManagerFactory etc. here
}
请求和响应示例
假设我们在数据库中有 30 个Persons。您现在可以触发请求GET http://localhost:8080/persons,您会看到类似以下内容:
{ "links" : [
{ "rel" : "next", "href" : "http://localhost:8080/persons?page=1&size=20 }
],
"content" : [
… // 20 Person instances rendered here
],
"pageMetadata" : {
"size" : 20,
"totalElements" : 30,
"totalPages" : 2,
"number" : 0
}
}
请注意,汇编程序生成了正确的 URI,并且还选择了默认配置,以将参数解析为 Pageable 以用于即将到来的请求。这意味着,如果您更改该配置,链接将自动遵循更改。默认情况下,汇编器指向调用它的控制器方法,但可以通过提交自定义Link 来自定义该方法,以用作构建指向PagedResourcesAssembler.toResource(…) 方法重载的分页链接的基础。
展望
PagedResourcesAssembler 位将在即将发布的 Spring Data Babbage release train 里程碑版本中提供。它已在当前快照中可用。您可以在我的 Spring RESTBucks sample application 中看到一个工作示例。只需克隆它,运行 mvn jetty:run 和 curl http://localhost:8080/pages。