本指南将指导您创建一个应用程序,该应用程序通过基于超媒体的RESTful前端来访问基于文档的数据。
你会建立什么
您将构建一个Spring应用程序,让您使用Spring Data REST 创建和检索Person对象存储在MongoDB NoSQL数据库中
。Spring Data REST采用Spring HATEOAS和Spring Data MongoDB的特性,并将它们自动组合在一起。
环境依赖
在pom文件引入spring-boot-starter-data-mongodb依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-rest</artifactId> </dependency>
创建一个域对象
创建一个新的域对象来呈现一个人。
package hello; import org.springframework.data.annotation.Id; public class Person { @Id private String id; private String firstName; private String lastName; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } }
该Person
有一个名字和姓氏。还有一个id对象被配置为自动生成,所以你不必处理它。
创建一个Person存储库
接下来,您需要创建一个简单的存储库。
package hello; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.data.repository.query.Param; import org.springframework.data.rest.core.annotation.RepositoryRestResource; import java.util.List; @RepositoryRestResource(collectionResourceRel = "people", path = "people") public interface PersonRepository extends MongoRepository<Person, String> { List<Person> findByLastName(@Param("name") String name); }
这个存储库是一个接口,将允许您执行涉及Person
对象的各种操作。它通过继承MongoRepository,来获得这些操作;MongoRepository继承自Spring Data Commons中定义的PagingAndSortingRepository接口。
在运行时,Spring Data REST将自动创建该接口的实现。然后,它将使用@RepositoryRestResource注释来指导Spring MVC创建RESTful端点/people
。
@RepositoryRestResource
对于被输出的存储库不是必需的。它仅用于更改出口的细节,例如使用/people
而不是默认值/persons
。
在这里,您还定义了一个自定义查询来检索Person
基于lastName 的对象列表。在本指南中,您将看到如何进一步调用它。
测试应用程序
现在应用程序正在运行,您可以测试它。您可以使用任何您希望的REST客户端。
首先,看到顶级服务。
在这里,你第一眼瞥见此服务器提供的功能。有一个people链接位于http://localhost:8080/people。它有一些选项,比如?page
,?size
和?sort
。
Spring Data REST使用HAL格式来输出JSON。它提供连接数据的链接。
目前没有元素,因此没有分页数据。是时候创造一个新的Person了!
使用Google的Postman
使用 curl。
$ curl -i -X POST -H "Content-Type:application/json" -d "{ "firstName" : "Frodo", "lastName" : "Baggins" }" http://localhost:8080/people
-
-i:
确保您可以看到包含标题的响应消息。新创建的Person的URI 被显示 -
-X POST:
表明这是使用POST
方式创建请求 -
-H "Content-Type:application/json":
设置内容类型,以便应用程序知道负载包含一个JSON对象 -
-d '{ "firstName" : "Frodo", "lastName" : "Baggins" }':
是被发送的数据
从这里你可以查询所有people:
people对象是一个有Frodo的列表。注意它是如何包含自我链接的。
你可以直接查询单个记录:
这可能看起来纯粹是基于web的,但在幕后,它正在与您的MongoDB数据库对话。
在本指南中,只有一个域对象。对于域对象相互关联的更复杂的系统,Spring Data REST将提供额外的链接,以帮助导航到连接的记录。
查找所有的自定义查询:
您可以看到包含HTTP查询参数name的查询的URL。这与嵌入在接口中的注释@Param("name")匹配。
使用findByLastName
查询
因为在代码中,你将它定义为返回List<Person>,它将返回所有结果。如果你定义它只返回Person
,它会选择一个Person对象返回。由于这可能是不可预知的,所以对可以返回多个条目的查询,你不能这样做。
你可以发出PUT
、PATCH
、DELETE
REST调用,来替换、更新、删除现有记录。
PUT
替换整个记录。未提供的字段将被替换null
。PATCH
可用于更新项目的子集。
您可以删除记录:
这种超媒体驱动接口的一个方便的方面是,你可以使用curl(或者其他 REST客户端)来发现所有 RESTful端点。没有必要与客户交换正式的合同或接口文档。
概要
恭喜!您刚刚开发了基于超媒体的 RESTful前端和基于MongoDB的后端的应用程序。