本指南将引导您完成创建应用程序的过程,该应用程序通过基于超媒体休息的前端。
您将构建一个 Spring 应用程序,该应用程序允许您创建和检索存储在Person
蒙戈数据库通过使用Spring Data REST的NoSQL数据库。 Spring Data REST采用了以下特性:春天的哈特亚斯和春季数据 MongoDB并自动将它们组合在一起。
(资料图)
Spring Data REST 还支持春季数据 JPA,春天数据宝石火和弹簧数据 Neo4j作为后端数据存储,但这些不是本指南的一部分。 |
像大多数春天一样入门指南,您可以从头开始并完成每个步骤,也可以绕过您已经熟悉的基本设置步骤。无论哪种方式,您最终都会得到工作代码。
要从头开始,请继续从 Spring 初始化开始.
要跳过基础知识,请执行以下操作:
下载并解压缩本指南的源存储库,或使用吉特:git clonehttps://github.com/spring-guides/gs-accessing-mongodb-data-rest.git
光盘成gs-accessing-mongodb-data-rest/initial
跳转到安装并启动 MongoDB.完成后,您可以根据 中的代码检查结果。gs-accessing-mongodb-data-rest/complete
你可以使用这个预初始化项目,然后单击生成以下载 ZIP 文件。此项目配置为适合本教程中的示例。
手动初始化项目:
导航到https://start.spring.io.此服务拉入应用程序所需的所有依赖项,并为您完成大部分设置。选择 Gradle 或 Maven 以及您要使用的语言。本指南假定您选择了 Java。单击依赖关系,然后选择休息存储库和Spring Data MongoDB。单击生成。下载生成的 ZIP 文件,该文件是配置了您选择的 Web 应用程序的存档。如果您的 IDE 集成了 Spring Initializr,则可以从 IDE 完成此过程。 |
您也可以从 Github 分叉项目,然后在 IDE 或其他编辑器中打开它。 |
要使本指南正常工作,您必须建立本地MongoDB服务器。
在安装了自制软件的 Mac OS X 计算机上,运行以下命令:
brew install mongodb
您可以在以下位置找到更多安装选项https://docs.mongodb.org/manual/installation/.
安装 MongoDB 后,您需要启动守护进程。在 Mac 上,您可以使用以下命令:mongo
$ mongodall output going to: /usr/local/var/log/mongodb/mongo.log
您可以通过运行命令从另一个终端窗口启动MongoDB客户端。mongo
创建一个新的域对象来呈现人员,如以下示例(在 中)所示:src/main/java/com/example/accessingmongodbdatarest/Person.java
package com.example.accessingmongodbdatarest;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; }}
对象具有名字和姓氏。(还有一个 ID 对象,它配置为自动生成,所以不需要处理它。Person
接下来,您需要创建一个简单的存储库,如以下列表 (in ) 所示:src/main/java/com/example/accessingmongodbdatarest/PersonRepository.java
package com.example.accessingmongodbdatarest;import java.util.List;import org.springframework.data.mongodb.repository.MongoRepository;import org.springframework.data.repository.query.Param;import org.springframework.data.rest.core.annotation.RepositoryRestResource;@RepositoryRestResource(collectionResourceRel = "people", path = "people")public interface PersonRepository extends MongoRepository{ List findByLastName(@Param("name") String name);}
此存储库是一个接口,允许您执行涉及对象的各种操作。它通过扩展来获取这些操作,进而扩展Person
MongoRepository
PagingAndSortingRepositorySpring Data Commons 中定义的接口。
在运行时,Spring Data REST 会自动创建此接口的实现。然后它使用@RepositoryRestResource注释以指示 Spring MVC 在 创建 RESTful 端点。/people
|
在这里,您还定义了一个自定义查询,以根据值检索对象列表。您可以在本指南中进一步了解如何调用它。Person
lastName
默认情况下,Spring Boot 会尝试连接到本地托管的 MongoDB 实例。阅读参考文档了解如何将应用程序指向托管在其他地方的 MongoDB 实例。 |
@SpringBootApplication
是一个方便的注释,它添加了以下所有内容:
@Configuration
:将类标记为应用程序上下文的 Bean 定义源。@EnableAutoConfiguration
:告诉 Spring 引导根据类路径设置、其他 bean 和各种属性设置开始添加 bean。例如,如果 在类路径上,则此注释会将应用程序标记为 Web 应用程序并激活关键行为,例如设置 .spring-webmvc
DispatcherServlet
@ComponentScan
:告诉 Spring 在包中查找其他组件、配置和服务,让它找到控制器。com/example
该方法使用 Spring Boot 的方法启动应用程序。您是否注意到没有一行 XML?也没有文件。此 Web 应用程序是 100% 纯 Java,您无需处理配置任何管道或基础结构。main()
SpringApplication.run()
web.xml
您可以使用 Gradle 或 Maven 从命令行运行应用程序。您还可以构建一个包含所有必需依赖项、类和资源的可执行 JAR 文件并运行该文件。通过构建可执行 jar,可以轻松地在整个开发生命周期中跨不同环境等将服务作为应用程序进行交付、版本控制和部署。
如果使用 Gradle,则可以使用 .或者,您可以使用 JAR 文件生成 JAR 文件,然后运行该文件,如下所示:./gradlew bootRun
./gradlew build
java -jar build/libs/gs-accessing-mongodb-data-rest-0.1.0.jar
如果使用 Maven,则可以使用 运行应用程序。或者,您可以使用 JAR 文件生成 JAR 文件,然后运行该文件,如下所示:./mvnw spring-boot:run
./mvnw clean package
java -jar target/gs-accessing-mongodb-data-rest-0.1.0.jar
此处描述的步骤将创建一个可运行的 JAR。你也可以构建经典 WAR 文件. |
将显示日志记录输出。该服务应在几秒钟内启动并运行。
现在应用程序正在运行,您可以对其进行测试。您可以使用任何您想要的 REST 客户端。以下示例使用 *nix 工具 。curl
首先,您希望查看顶级服务,如以下示例所示:
$ curl http://localhost:8080{ "_links" : { "people" : { "href" : "http://localhost:8080/people{?page,size,sort}", "templated" : true } }}
前面的示例提供了此服务器必须提供的功能的第一瞥。有一个链接位于people
http://localhost:8080/people.它有一些选项,例如、 和 。?page
?size
?sort
Spring Data REST 使用HAL 格式用于 JSON 输出。它非常灵活,并提供了一种提供与所提供数据相邻的链接的便捷方法。 |
使用人员链接时,您会看到数据库中的记录(目前没有):Person
$ curl http://localhost:8080/people{ "_links" : { "self" : { "href" : "http://localhost:8080/people{?page,size,sort}", "templated" : true }, "search" : { "href" : "http://localhost:8080/people/search" } }, "page" : { "size" : 20, "totalElements" : 0, "totalPages" : 0, "number" : 0 }}
目前没有元素,因此没有页面。是时候创建一个新的 !Person
如果多次运行本指南,可能会有剩余数据。请参阅MongoDB shell 快速参考以获取命令,以便在需要重新启动时查找和删除数据库。 |
以下命令创建一个名为“Frodo Baggins”的人:
$ curl -i -X POST -H "Content-Type:application/json" -d "{ \"firstName\" : \"Frodo\", \"lastName\" : \"Baggins\" }" http://localhost:8080/peopleHTTP/1.1 201 CreatedServer: Apache-Coyote/1.1Location: http://localhost:8080/people/53149b8e3004990b1af9f229Content-Length: 0Date: Mon, 03 Mar 2014 15:08:46 GMT
-i
:确保您可以看到包含标头的响应消息。将显示新创建的 URI。Person
-X POST
:表示此 a 用于创建新条目。POST
-H "Content-Type:application/json"
:设置内容类型,以便应用程序知道有效负载包含 JSON 对象。-d "{ "firstName" : "Frodo", "lastName" : "Baggins" }"
:是否正在发送数据。请注意上一个操作如何包含标头。这包含新创建的资源的 URI。Spring Data REST 还有两个方法( 和 ),您可以使用它们来配置框架以立即返回刚刚创建/更新的资源的表示形式。 |
由此可以查询所有人,如以下示例所示:
$ curl http://localhost:8080/people{ "_links" : { "self" : { "href" : "http://localhost:8080/people{?page,size,sort}", "templated" : true }, "search" : { "href" : "http://localhost:8080/people/search" } }, "_embedded" : { "persons" : [ { "firstName" : "Frodo", "lastName" : "Baggins", "_links" : { "self" : { "href" : "http://localhost:8080/people/53149b8e3004990b1af9f229" } } } ] }, "page" : { "size" : 20, "totalElements" : 1, "totalPages" : 1, "number" : 0 }}
该对象包含一个带有佛罗多的列表。请注意它如何包含一个链接。Spring Data REST 也使用persons
self
埃沃变形器将分组的实体名称复数化。
您可以直接查询单个记录,如以下示例所示:
$ curl http://localhost:8080/people/53149b8e3004990b1af9f229{ "firstName" : "Frodo", "lastName" : "Baggins", "_links" : { "self" : { "href" : "http://localhost:8080/people/53149b8e3004990b1af9f229" } }}
这可能看起来纯粹是基于Web的,但是,在幕后,它正在与您启动的MongoDB数据库进行通信。 |
在本指南中,只有一个域对象。对于更复杂的系统,其中域对象彼此相关,Spring Data REST呈现其他链接以帮助导航到连接的记录。
查找所有自定义查询,如以下示例所示:
$ curl http://localhost:8080/people/search{ "_links" : { "findByLastName" : { "href" : "http://localhost:8080/people/search/findByLastName{?name}", "templated" : true } }}
您可以看到查询的 URL,包括 HTTP 查询参数 。这与界面中嵌入的注释匹配。name
@Param("name")
若要使用该查询,请运行以下命令:findByLastName
$ curl http://localhost:8080/people/search/findByLastName?name=Baggins{ "_embedded" : { "persons" : [ { "firstName" : "Frodo", "lastName" : "Baggins", "_links" : { "self" : { "href" : "http://localhost:8080/people/53149b8e3004990b1af9f229" } } } ] }}
由于已将其定义为在代码中返回,因此它将返回所有结果。如果你已将其定义为仅返回,它将选取其中一个要返回的对象。由于这可能是不可预测的,因此您可能不希望对可以返回多个条目的查询执行此操作。List
Person
Person
您还可以发出 、 和 REST 调用来分别替换、更新或删除现有记录。以下示例使用调用:PUT
PATCH
DELETE
PUT
$ curl -X PUT -H "Content-Type:application/json" -d "{ \"firstName\": \"Bilbo\", \"lastName\": \"Baggins\" }" http://localhost:8080/people/53149b8e3004990b1af9f229$ curl http://localhost:8080/people/53149b8e3004990b1af9f229{ "firstName" : "Bilbo", "lastName" : "Baggins", "_links" : { "self" : { "href" : "http://localhost:8080/people/53149b8e3004990b1af9f229" } }}
以下示例使用调用:PATCH
$ curl -X PATCH -H "Content-Type:application/json" -d "{ \"firstName\": \"Bilbo Jr.\" }" http://localhost:8080/people/53149b8e3004990b1af9f229$ curl http://localhost:8080/people/53149b8e3004990b1af9f229{ "firstName" : "Bilbo Jr.", "lastName" : "Baggins", "_links" : { "self" : { "href" : "http://localhost:8080/people/53149b8e3004990b1af9f229" } }}
|
您还可以删除记录,如以下示例所示:
$ curl -X DELETE http://localhost:8080/people/53149b8e3004990b1af9f229$ curl http://localhost:8080/people{ "_links" : { "self" : { "href" : "http://localhost:8080/people{?page,size,sort}", "templated" : true }, "search" : { "href" : "http://localhost:8080/people/search" } }, "page" : { "size" : 20, "totalElements" : 0, "totalPages" : 0, "number" : 0 }}
一个方便的方面超媒体驱动的界面是如何使用 curl(或任何您喜欢的 REST 客户端)发现所有 RESTful 端点。无需与客户交换正式合同或接口文档。
祝贺!您刚刚开发了一个应用程序,其中包含基于超媒体REST前端和基于MongoDB的后端。