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 Repository 导出到 Web。它通过将 Repository 导出到 RESTful URL 来提供一致的交互 API,这些 URL 可以通过几种不同的方式进行配置。
Spring Data REST 支持顶级实体(由 Spring Data Repository 直接管理的那些领域对象)的 CRUD 操作,只需编写一行代码来定义一个扩展 Spring Data CrudRepository 接口的接口。完成此操作后,您的实体将具有完整的 RESTful 语义。您可以使用遵循 HATEOAS 原则的可发现标准 URL 创建新实体、更新现有实体和删除实体。这意味着访问您的 Spring Data REST 应用程序的用户代理无需事先了解您正在导出的资源。它可以通过对 JSON 中提供的 URL 进行连续调用来发现存在的实体以及这些实体上存在的关系。这些“链接”是 HATEOAS REST 应用程序的真正基础和强大之处。
彻底的改变
1.1 版本几乎是从头开始重写的。它不仅比 1.0 更容易配置,并且更好地符合 Spring MVC 对过渡到 Spring 3.2 的预期,而且 Spring Data REST 内部最大的变化是它现在支持除了 JPA 之外的其他类型的 Spring Data Repository 实现。无论使用何种后端数据存储,CRUD 和管理关系(如果数据存储支持)的 HTTP 语义都保持不变。
这意味着现在可以在同一个 Spring Data REST 应用程序中导出 JPA 实体和 MongoDB 实体,并使用通用 URL 结构以及所有实体和集合的标准 Spring HATEOAS 资源表示来访问这些实体。访问这些 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 数据库 的实体导出到不同的区域。阅读 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 创建了一个示例应用程序,演示了 HATEOAS 原则在现代 Web 应用程序中的使用。它被称为 spring-restbucks,是 Jim Webber、Savas Parastatidis 和 Ian Robinson 在《REST 实战》( Systematic Theology of REST services: REST in Practice) 中描述的 Restbucks 应用程序的实现。
混合 REST 服务
通过将 Spring Data REST 与您的其他 RESTful 服务混合使用,您可以在 Spring Data REST 导出的领域对象(您无需编写任何代码即可公开这些对象)与不代表实际实体而是代表某个过程的服务之间实现无缝集成。您可以在 spring-restbucks 应用程序中看到支付服务如何与领域对象 CRUD 交互的示例,其中信用卡支付处理由自定义控制器处理,而对象 CRUD 则由 Spring Data REST 处理。您的自定义控制器实际上可以与 Spring Data REST URL 结合使用,这样无论 URL 是指向您的自定义控制器、Spring Data REST JPA Repository 还是任何其他受支持的 Repository 样式,都可以在整个应用程序中保持一致且简单的 URL 结构。
这不是排他性的
Spring Data REST 不是非此即彼。如果您不想将所有 Repository 公开给 Web 客户端,没问题!有几种不同的方法可以关闭 Repository 的功能。您可以在源代码中嵌入注解,或者,如果您无法访问或根本无法添加 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 工件(当前版本为 SpringSource 里程碑存储库 中的 1.1.0.M1)来开始在您自己的应用程序中使用它,然后导入 Spring Data REST 配置,就像您在 spring-restbucks 应用程序中看到的那样。
在 CONFESS_2013 上了解更多信息
如果您计划参加四月第一周在维也纳举行的 CONFESS_2013,那么您可以在我关于将 JPA 实体直接导出到 Web 的演讲中听到所有关于 Spring Data REST 的信息。
链接
Spring Data REST 主页 | GitHub 上的源代码 | 参考文档