Spring Data 团队很高兴宣布在使用 RESTful 语义将领域对象导出到 Web 方面取得的下一个重大进展:Spring Data REST 1.1.0.M1 现已在 SpringSource 里程碑仓库中提供。
Spring Data REST 主页 | GitHub 上的源代码 | 参考文档
将领域对象导出到 Web
Spring Data REST 是一组 Spring MVC 组件,您可以将其添加到自己的 Spring MVC 应用程序中,以便使用 RESTful、HATEOAS 语义将 Spring Data 仓库导出到 Web。它通过将仓库导出到可通过几种不同方式配置的 RESTful URL,提供一致的交互 API。
Spring Data REST 支持顶级实体(由 Spring Data 仓库直接管理的领域对象)的 CRUD 操作,只需编写一行代码定义一个继承 Spring Data CrudRepository
接口的接口即可。完成后,您的实体就具备完整的 RESTful 语义。您可以创建新实体、更新现有实体并使用标准 URL 删除它们,这些 URL 遵循 HATEOAS 原则,是可发现的。这意味着访问您的 Spring Data REST 应用程序的用户代理无需提前了解您正在导出的资源。它可以通过对 JSON 中提供的 URL 进行连续调用来发现存在哪些实体以及这些实体上存在哪些关系。这些“链接”是 HATEOAS REST 应用程序的真正基础和力量所在。
从零开始的改变
1.1 版本实际上是彻头彻尾的重写。它不仅比 1.0 版本更容易配置,而且更好地符合了 Spring MVC 对迁移到 Spring 3.2 的预期,但 Spring Data REST 内部最大的变化是它现在支持 JPA 之外的其他类型的 Spring Data 仓库实现。无论使用何种后端数据存储,CRUD 和管理关系(如果数据存储支持)的 HTTP 语义保持不变。
这意味着现在可以在同一个 Spring Data REST 应用程序中导出 JPA 实体和 MongoDB 实体,并使用通用的 URL 结构以及标准 Spring HATEOAS Resource 表示方式来访问这些实体和集合。访问这些 RESTful URL 的用户代理不需要知道后端实体由哪个数据存储管理,最重要的是,您无需编写任何代码即可获得此功能!
MongoDB 支持
Spring Data REST 1.1 现在支持导出 MongoDB CrudRepository
实现。适用于 JPA 实体的相同 HTTP 语义也适用于 MongoDB @Document
实体。GET、POST、PUT、DELETE 当然都支持,@DBRef
也支持。您可以使用 GET、POST、PUT 和 DELETE 查看和管理两个文档之间的关系,并且可以基于您的 @Query
定义导出查询方法。请参考 spring-data-mongodb 参考文档,了解对象映射与 JPA 风格映射有何不同以及查询定义如何工作的完整详细信息。
Gemfire 支持
Spring Data REST 1.1 现在支持将使用高性能 Gemfire 数据库 的实体导出到不同的区域 (Region)。阅读 Spring Data Gemfire 文档,了解丰富的配置选项以及 Gemfire 中的 POJO 映射与其他映射技术有何不同的完整说明。
接下来支持 Neo4J
Spring Data REST 1.1 现在将支持 Neo4J GraphRepository
,通过下一版本的 spring-data-neo4j 2.3。当该版本普遍可用时(应在 Spring Data REST 1.1 RELEASE 普遍可用时或之前),您将能够使用标准的 HATEOAS 语义访问 @NodeEntity
及其关系,就像您对其他数据存储所做的那样。
将其添加到现有应用中
Spring Data REST 的设计方式使得您如果愿意,可以专门为 Spring Data REST 应用程序创建一个完整的应用。毕竟它只是一个标准的 Spring MVC Web 应用。但是当您将 Spring Data REST 添加到您自己的服务中时,事情会变得非常有趣。
Spring HATEOAS 的作者 Oliver Gierke 创建了一个示例应用程序,演示了在现代 Web 应用程序中如何使用 HATEOAS 原则。该应用程序名为 spring-restbucks,是对 REST 服务系统神学中描述的 Restbucks 应用程序的实现:由 Jim Webber、Savas Parastatidis 和 Ian Robinson 所著的 REST in Practice。
混合 REST 服务
通过将 Spring Data REST 与您的其他 RESTful 服务混合使用,您可以实现 Spring Data REST 导出的领域对象(您无需编写任何代码即可将其公开)与那些不代表实际实体而是代表流程的服务之间的无缝集成。在 spring-restbucks 应用程序中,您可以看到支付服务如何与领域对象 CRUD 交互的示例,其中信用卡支付处理由自定义控制器处理,而对象 CRUD 由 Spring Data REST 处理。您的自定义控制器实际上可以“搭便车”使用 Spring Data REST 的 URL,从而在整个应用程序中保持一致且简单的 URL 结构,无论该 URL 指向您的自定义控制器、Spring Data REST JPA 仓库,还是其他任何受支持的仓库风格。
这不是排他性的
使用 Spring Data REST 并非非此即彼。如果您不想将所有仓库都暴露给 Web 客户端,没问题!有几种不同的方式可以关闭仓库的功能。您可以将注解嵌入到源代码中,或者,如果您无法访问或根本不能添加 Spring Data REST 注解,您可以使用流畅的 DSL 风格配置来告诉 Spring Data REST 如何暴露您的资源。在您的应用程序中使用 Spring Data REST 并不意味着您只能采用一种方式。Spring Data REST 的结构使其可以与您现有的应用程序很好地协同工作,因此您可以纳入 Spring Data REST 中您想要的功能部分,同时仍然保留您习惯于在 Spring MVC 控制器中创建的所有自定义编码服务。
JSONP 支持迁移到过滤器
Spring Data REST 1.0 中内置的 JSONP 支持已从核心框架中移除,取而代之的是即将推出的通用 JSONP Servlet 过滤器,该过滤器将比 1.0 版本中 JSONP 的实现方式效果更好。当该过滤器普遍可用时,JSONP 支持不仅可以添加到 Spring Data REST,还可以添加到几乎任何基于 Servlet 的 REST 资源中。
安装和文档
要开始尝试 Spring Data REST,请查看参考文档,了解其大概情况,然后只需在您自己的应用程序中添加对 spring-data-rest-webmvc
artifact 的依赖(当前版本为 1.1.0.M1,位于SpringSource 里程碑仓库中),然后导入 Spring Data REST 配置,就像您在 spring-restbucks 应用程序中看到的那样。
在 CONFESS_2013 了解更多
如果您计划参加 4 月第一周在维也纳举行的 CONFESS_2013 大会,那么您可以在我关于将实体导出到 Web 的演讲中了解所有关于 Spring Data REST 的内容。
链接
Spring Data REST 主页 | GitHub 上的源代码 | 参考文档