ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# 使用REST访问MongoDB数据 本指南将引导您完成创建通过基于 访问基于文档的数据的应用程序的过程 [超媒体的](https://spring.io/guides/gs/rest-hateoas) RESTful前端 。 ## 你会建立什么 您将构建一个Spring应用程序,使您可以创建和检索 `Person`对象存储在 [MongoDB](https://www.mongodb.org/) 使用Spring Data REST将 NoSQL数据库中。 Spring Data REST具有 的功能, [Spring HATEOAS](https://projects.spring.io/spring-hateoas) 和 [Spring Data MongoDB](https://projects.spring.io/spring-data-mongodb) 并将它们自动组合在一起。 Spring Data REST还支持将 Spring Data JPA , Spring Data Gemfire 和 Spring Data Neo4j 作为后端数据存储,但是这些都不属于本指南的一部分。 ## 你需要什么 * 约15分钟 * 最喜欢的文本编辑器或IDE * [JDK 1.8](http://www.oracle.com/technetwork/java/javase/downloads/index.html) 或更高版本 * [Gradle 4+](http://www.gradle.org/downloads) 或 [Maven 3.2+](https://maven.apache.org/download.cgi) * 您还可以将代码直接导入到IDE中: * [弹簧工具套件(STS)](https://spring.io/guides/gs/sts) * [IntelliJ IDEA](https://spring.io/guides/gs/intellij-idea/) ## 如何完成本指南 像大多数Spring 一样 [入门指南](https://spring.io/guides) ,您可以从头开始并完成每个步骤,也可以绕过您已经熟悉的基本设置步骤。 无论哪种方式,您最终都可以使用代码。 要 **从头开始** ,请继续进行“ [从Spring Initializr开始”](https://spring.io/guides/gs/accessing-mongodb-data-rest/#scratch) 。 要 **跳过基础知识** ,请执行以下操作: * [下载](https://github.com/spring-guides/gs-accessing-mongodb-data-rest/archive/master.zip) 并解压缩本指南的源存储库,或使用 对其进行克隆 [Git](https://spring.io/understanding/Git) : `git clone [https://github.com/spring-guides/gs-accessing-mongodb-data-rest.git](https://github.com/spring-guides/gs-accessing-mongodb-data-rest.git)` * 光盘进入 `gs-accessing-mongodb-data-rest/initial` * 继续 [安装并启动MongoDB](https://spring.io/guides/gs/accessing-mongodb-data-rest/#initial) 。 **完成后** ,您可以根据中的代码检查结果 `gs-accessing-mongodb-data-rest/complete`. ## 从Spring Initializr开始 如果您使用Maven,请访问 [Spring Initializr](https://start.spring.io/#!type=maven-project&language=java&platformVersion=2.4.3.RELEASE&packaging=jar&jvmVersion=1.8&groupId=com.example&artifactId=accessing-mongodb-data-rest%20&name=accessing-mongodb-data-rest%20&description=Demo%20project%20for%20Spring%20Boot&packageName=com.example.accessing-mongodb-data-rest%20&dependencies=data-rest,data-mongodb) 以生成具有所需依赖项(Rest Repositories和Spring Data MongoDB)的新项目。 以下清单显示了 `pom.xml` 选择Maven时创建的文件: ~~~ <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.3</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>accessing-mongodb-data-rest</artifactId> <version>0.0.1-SNAPSHOT</version> <name>accessing-mongodb-data-rest</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <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> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> ~~~ 如果您使用Gradle,请访问 [Spring Initializr](https://start.spring.io/#!type=gradle-project&language=java&platformVersion=2.4.3.RELEASE&packaging=jar&jvmVersion=1.8&groupId=com.example&artifactId=accessing-mongodb-data-rest%20&name=accessing-mongodb-data-rest%20&description=Demo%20project%20for%20Spring%20Boot&packageName=com.example.accessing-mongodb-data-rest%20&dependencies=data-rest,data-mongodb) 以生成具有所需依赖项(Rest Repositories和Spring Data MongoDB)的新项目。 以下清单显示了 `build.gradle`选择Gradle时创建的文件: ~~~ plugins { id 'org.springframework.boot' version '2.4.3' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-mongodb' implementation 'org.springframework.boot:spring-boot-starter-data-rest' testImplementation 'org.springframework.boot:spring-boot-starter-test' } test { useJUnitPlatform() } ~~~ ### 手动初始化(可选) 如果要手动初始化项目而不是使用前面显示的链接,请按照以下步骤操作: 1. Navigate to [https://start.spring.io](https://start.spring.io). This service pulls in all the dependencies you need for an application and does most of the setup for you. 2. Choose either Gradle or Maven and the language you want to use. This guide assumes that you chose Java. 3. Click **Dependencies** and select **Rest Repositories** and **Spring Data MongoDB**. 4. Click **Generate**. 5. 下载生成的ZIP文件,该文件是使用您的选择配置的Web应用程序的存档。 如果您的IDE集成了Spring Initializr,则可以从IDE中完成此过程。 ## 安装并启动MongoDB 为了使本指南生效,您必须站立本地的MongoDB服务器。 在安装了Homebrew的Mac OS X机器上,运行以下命令: ~~~ brew install mongodb ~~~ 您可以在 找到更多安装选项 [https://docs.mongodb.org/manual/installation/中](https://docs.mongodb.org/manual/installation/) 。 安装MongoDB之后,您需要启动 `mongo`守护程序。 在Mac上,您可以使用以下命令: ~~~ $ mongod all 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; } } ~~~ 这 `Person`对象具有名字和姓氏。 (还有一个ID对象,该对象被配置为自动生成,因此无需处理。) ## 创建个人资料库 接下来,您需要创建一个简单的存储库,如下面的清单(在 `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<Person, String> { List<Person> findByLastName(@Param("name") String name); } ~~~ 该存储库是一个界面,可让您执行涉及以下内容的各种操作 `Person`对象。 它通过扩展来获得这些操作 `MongoRepository`,这反过来又扩展了 [`PagingAndSortingRepository`](https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/repository/PagingAndSortingRepository.html) Spring Data Commons中定义的接口。 在运行时,Spring Data REST自动创建此接口的实现。 然后,它使用 [@RepositoryRestResource](https://docs.spring.io/spring-data/rest/docs/current/api/org/springframework/data/rest/core/annotation/RepositoryRestResource.html) 批注指示Spring MVC在以下位置创建RESTful端点 `/people`. @RepositoryRestResource不需要导出存储库。 它仅用于更改导出详细信息,例如使用 /people 而不是默认值 /persons. 在这里,您还定义了一个自定义查询来检索以下内容的列表 `Person` 基于的对象 `lastName`价值。 您可以在本指南中进一步了解如何调用它。 默认情况下,Spring Boot尝试连接到本地托管的MongoDB实例。 阅读 参考文档 ,了解如何将您的应用程序指向其他地方托管的MongoDB实例。 `@SpringBootApplication` 是一个方便注释,它添加了以下所有内容: * `@Configuration`:将类标记为应用程序上下文的Bean定义的源。 * `@EnableAutoConfiguration`:告诉Spring Boot根据类路径设置,其他bean和各种属性设置开始添加bean。 例如,如果 `spring-webmvc` 在类路径上,此注释将应用程序标记为Web应用程序并激活关键行为,例如设置 `DispatcherServlet`. * `@ComponentScan`: Tells Spring to look for other components, configurations, and services in the `com/example` package, letting it find the controllers. 这 `main()` 方法使用Spring Boot的 `SpringApplication.run()`启动应用程序的方法。 您是否注意到没有一行XML? 没有 `web.xml`文件。 该Web应用程序是100%纯Java,因此您无需处理任何管道或基础结构。 ### 建立可执行的JAR 您可以使用Gradle或Maven从命令行运行该应用程序。 您还可以构建一个包含所有必需的依赖项,类和资源的可执行JAR文件,然后运行该文件。 生成可执行jar使得在整个开发生命周期中,跨不同环境等等的情况下,都可以轻松地将服务作为应用程序进行发布,版本控制和部署。 如果您使用Gradle,则可以通过使用以下命令运行该应用程序 `./gradlew bootRun`。 或者,您可以通过使用以下命令构建JAR文件: `./gradlew build` 然后运行JAR文件,如下所示: ~~~ java -jar build/libs/gs-accessing-mongodb-data-rest-0.1.0.jar ~~~ 如果您使用Maven,则可以通过使用以下命令运行该应用程序 `./mvnw spring-boot:run`。 或者,您可以使用以下命令构建JAR文件: `./mvnw clean package` 然后运行JAR文件,如下所示: ~~~ java -jar target/gs-accessing-mongodb-data-rest-0.1.0.jar ~~~ 此处描述的步骤将创建可运行的JAR。 您还可以 构建经典的WAR文件 。 显示日志记录输出。 该服务应在几秒钟内启动并运行。 ## Test the Application Now that the application is running, you can test it. You can use any REST client you wish. The following examples use the \*nix tool `curl`. First you want to see the top level service, as the following example shows: ~~~ $ curl http://localhost:8080 { "_links" : { "people" : { "href" : "http://localhost:8080/people{?page,size,sort}", "templated" : true } } } ~~~ 前面的示例提供了该服务器必须提供的功能的第一印象。 有一个 `people`链接位于 [http:// localhost:8080 / 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/people HTTP/1.1 201 Created Server: Apache-Coyote/1.1 Location: http://localhost:8080/people/53149b8e3004990b1af9f229 Content-Length: 0 Date: Mon, 03 Mar 2014 15:08:46 GMT ~~~ * `-i`:确保您可以看到包含标题的响应消息。 新创建的URI `Person` 显示。 * `-X POST`:发出信号 `POST` 用于创建新条目。 * `-H "Content-Type:application/json"`:设置内容类型,以便应用程序知道有效负载包含JSON对象。 * `-d '{ "firstName" : "Frodo", "lastName" : "Baggins" }'`:正在发送数据。 注意前一个 POST 操作包括 Location标头。 它包含新创建的资源的URI。 Spring Data REST也有两种方法( RepositoryRestConfiguration.setReturnBodyOnCreate(…) 和 setReturnBodyOnUpdate(…)),您可以将其配置为立即返回刚创建/更新的资源的表示形式的框架。 从中可以查询所有人,如以下示例所示: ~~~ $ 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 } } ~~~ 这 `persons`对象包含带有Frodo的列表。 请注意,它如何包含一个 `self`关联。 Spring Data REST还使用 [Evo Inflector](https://www.atteo.org/2011/12/12/Evo-Inflector.html) 来对实体名称进行分组以进行分组。 您可以直接查询单个记录,如以下示例所示: ~~~ $ 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`,它会选择 `Person`要返回的对象。 由于这可能是不可预测的,因此对于可能返回多个条目的查询,您可能不想这样做。 您也可以发出 `PUT`, `PATCH`, 和 `DELETE`REST调用分别替换,更新或删除现有记录。 以下示例使用 `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" } } } ~~~ PUT替换整个记录。 未提供的字段将被替换为 null。 您可以使用 PATCH 更新项目的子集。 您还可以删除记录,如以下示例所示: ~~~ $ 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 } } ~~~ 此 一个方便方面 [超媒体驱动的界面的](https://spring.io/understanding/HATEOAS) 是如何使用curl(或您喜欢的任何REST客户端)发现所有RESTful端点。 无需与客户交换正式的合同或接口文档。 ## 概括 恭喜你! 您刚刚开发了一个具有基于 的应用程序 [超媒体的](https://spring.io/guides/gs/rest-hateoas) REST前端和基于MongoDB的后端 。