# 使用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的后端 。
- springboot概述
- springboot構建restful服務
- spring構建一個RESTful Web服務
- spring定時任務
- 消費RESTful Web服務
- gradle構建項目
- maven構建項目
- springboot使用jdbc
- springboot應用上傳文件
- 使用LDNA驗證用戶
- 使用 spring data redis
- 使用 spring RabbitTemplate消息隊列
- 用no4j訪問nosql數據庫
- springboot驗證web表單
- Spring Boot Actuator構j建服務
- 使用jms傳遞消息
- springboot創建批處理服務
- spring security保護web 安全
- 在Pivotal GemFire中訪問數據
- 使用Spring Integration
- 使用springboot jpa進行數據庫操作
- 數據庫事務操作
- 操作mongodb
- springmvc+tymleaf創建web應用
- 將Spring Boot JAR應用程序轉換為WAR
- 創建異步服務
- spring提交表單
- 使用WebSocket構建交互式Web應用程序
- 使用REST訪問Neo4j數據
- jquery消費restful
- springboot跨域請求
- 消費SOAP Web服務
- springboot使用緩存
- 使用Vaadin創建CRUD UI
- 使用REST訪問JPA數據
- 使用REST訪問Pivotal GemFire中的數據
- 構建soap服務
- 使用rest訪問mongodb數據
- 構建springboot應用docker鏡像
- 從STS部署到Cloud Foundry
- springboot測試web應用
- springboot訪問mysql
- springboot編寫自定義模塊并使用
- 使用Google Cloud Pub / Sub進行消息傳遞
- 構建反應式RESTful Web服務
- 使用Redis主動訪問數據
- Spring Boot 部署到Kubernetes
- 使用反應式協議R2DBC訪問數據
- Spring Security架構
- spring構建Docker鏡像詳解
- Spring Boot和OAuth2
- springboot應用部署到k8s
- spring構建rest服務詳解