
本指南將引導您完成創建應用程序的過程,該應用程序通過基于超媒體休息的前端。
您將構建一個 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的后端。