
本指南將引導(dǎo)您完成創(chuàng)建應(yīng)用程序的過(guò)程,該應(yīng)用程序通過(guò)基于超媒體?寧?kù)o前端。
您將構(gòu)建一個(gè) Spring 應(yīng)用程序,該應(yīng)用程序允許您使用 Spring Data REST 創(chuàng)建和檢索存儲(chǔ)在數(shù)據(jù)庫(kù)中的對(duì)象。 Spring Data REST 具有以下功能:??Person?
?春天的哈特亞斯和春季數(shù)據(jù) JPA并自動(dòng)將它們組合在一起。
Spring Data REST 還支持彈簧數(shù)據(jù) Neo4j,春天數(shù)據(jù)寶石火和春季數(shù)據(jù) MongoDB作為后端數(shù)據(jù)存儲(chǔ),但這些不是本指南的一部分。
|
像大多數(shù)春天一樣入門指南,您可以從頭開(kāi)始并完成每個(gè)步驟,也可以繞過(guò)您已經(jīng)熟悉的基本設(shè)置步驟。無(wú)論哪種方式,您最終都會(huì)得到工作代碼。
要從頭開(kāi)始,請(qǐng)繼續(xù)從 Spring 初始化開(kāi)始.
要跳過(guò)基礎(chǔ)知識(shí),請(qǐng)執(zhí)行以下操作:
下載?并解壓縮本指南的源存儲(chǔ)庫(kù),或使用吉特:git clonehttps://github.com/spring-guides/gs-accessing-data-rest.git
光盤成gs-accessing-data-rest/initial
跳轉(zhuǎn)到創(chuàng)建域?qū)ο?完成后,您可以根據(jù) 中的代碼檢查結(jié)果。??gs-accessing-data-rest/complete?
?
你可以使用這個(gè)預(yù)初始化項(xiàng)目,然后單擊生成以下載 ZIP 文件。此項(xiàng)目配置為適合本教程中的示例。
手動(dòng)初始化項(xiàng)目:
導(dǎo)航到https://start.spring.io.此服務(wù)拉入應(yīng)用程序所需的所有依賴項(xiàng),并為您完成大部分設(shè)置。選擇 Gradle 或 Maven 以及您要使用的語(yǔ)言。本指南假定您選擇了 Java。單擊依賴關(guān)系,然后選擇休息存儲(chǔ)庫(kù)、Spring 數(shù)據(jù) JPA和H2 數(shù)據(jù)庫(kù)。單擊生成。下載生成的 ZIP 文件,該文件是配置了您選擇的 Web 應(yīng)用程序的存檔。如果您的 IDE 集成了 Spring Initializr,則可以從 IDE 完成此過(guò)程。 |
您也可以從 Github 分叉項(xiàng)目,然后在 IDE 或其他編輯器中打開(kāi)它。 |
創(chuàng)建一個(gè)新的域?qū)ο髞?lái)呈現(xiàn)人員,如以下清單(在 中)所示:??src/main/java/com/example/accessingdatarest/Person.java?
?
package com.example.accessingdatarest;import jakarta.persistence.Entity;import jakarta.persistence.GeneratedValue;import jakarta.persistence.GenerationType;import jakarta.persistence.Id;@Entitypublic class Person { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long 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; }}
對(duì)象具有名字和姓氏。(還有一個(gè)配置為自動(dòng)生成的 ID 對(duì)象,因此您無(wú)需處理它。??Person?
?
接下來(lái),您需要?jiǎng)?chuàng)建一個(gè)簡(jiǎn)單的存儲(chǔ)庫(kù),如以下列表 (in ) 所示:??src/main/java/com/example/accessingdatarest/PersonRepository.java?
?
package com.example.accessingdatarest;import java.util.List;import org.springframework.data.repository.PagingAndSortingRepository;import org.springframework.data.repository.CrudRepository;import org.springframework.data.repository.query.Param;import org.springframework.data.rest.core.annotation.RepositoryRestResource;@RepositoryRestResource(collectionResourceRel = "people", path = "people")public interface PersonRepository extends PagingAndSortingRepository, CrudRepository { List findByLastName(@Param("name") String name);}
此存儲(chǔ)庫(kù)是一個(gè)界面,可讓您執(zhí)行涉及對(duì)象的各種操作。它通過(guò)擴(kuò)展??Person?
?PagingAndSortingRepository在 Spring 數(shù)據(jù)共享中定義的接口。
在運(yùn)行時(shí),Spring Data REST 會(huì)自動(dòng)創(chuàng)建此接口的實(shí)現(xiàn)。然后它使用@RepositoryRestResource注釋以指示 Spring MVC 在 創(chuàng)建 RESTful 端點(diǎn)。??/people?
?
? |
在這里,您還定義了一個(gè)自定義查詢,以檢索基于 .您可以在本指南的后面部分了解如何調(diào)用它。??Person?
???lastName?
?
??@SpringBootApplication?
?是一個(gè)方便的注釋,它添加了以下所有內(nèi)容:
?@Configuration?
?:將類標(biāo)記為應(yīng)用程序上下文的 Bean 定義源。??@EnableAutoConfiguration?
?:告訴 Spring 引導(dǎo)根據(jù)類路徑設(shè)置、其他 bean 和各種屬性設(shè)置開(kāi)始添加 bean。例如,如果 在類路徑上,則此注釋會(huì)將應(yīng)用程序標(biāo)記為 Web 應(yīng)用程序并激活關(guān)鍵行為,例如設(shè)置 .spring-webmvc
DispatcherServlet
??@ComponentScan?
?:告訴 Spring 在包中查找其他組件、配置和服務(wù),讓它找到控制器。com/example
該方法使用 Spring Boot 的方法啟動(dòng)應(yīng)用程序。您是否注意到?jīng)]有一行 XML?也沒(méi)有文件。此 Web 應(yīng)用程序是 100% 純 Java,您無(wú)需處理配置任何管道或基礎(chǔ)結(jié)構(gòu)。??main()?
???SpringApplication.run()?
???web.xml?
?
Spring Boot 會(huì)自動(dòng)啟動(dòng) Spring Data JPA 以創(chuàng)建 的具體實(shí)現(xiàn),并將其配置為使用 JPA 與后端內(nèi)存數(shù)據(jù)庫(kù)通信。??PersonRepository?
?
Spring Data REST建立在Spring MVC之上。它創(chuàng)建了一個(gè)Spring MVC控制器,JSON轉(zhuǎn)換器和其他bean的集合,以提供RESTful前端。這些組件鏈接到Spring Data JPA后端。當(dāng)您使用 Spring 引導(dǎo)時(shí),這一切都是自動(dòng)配置的。如果你想研究它是如何工作的,通過(guò)查看Spring Data REST。??RepositoryRestMvcConfiguration?
?
您可以使用 Gradle 或 Maven 從命令行運(yùn)行應(yīng)用程序。您還可以構(gòu)建一個(gè)包含所有必需依賴項(xiàng)、類和資源的可執(zhí)行 JAR 文件并運(yùn)行該文件。通過(guò)構(gòu)建可執(zhí)行 jar,可以輕松地在整個(gè)開(kāi)發(fā)生命周期中跨不同環(huán)境等將服務(wù)作為應(yīng)用程序進(jìn)行交付、版本控制和部署。
如果使用 Gradle,則可以使用 .或者,您可以使用 JAR 文件生成 JAR 文件,然后運(yùn)行該文件,如下所示:??./gradlew bootRun?
???./gradlew build?
?
java -jar build/libs/gs-accessing-data-rest-0.1.0.jar
如果使用 Maven,則可以使用 運(yùn)行應(yīng)用程序。或者,您可以使用 JAR 文件生成 JAR 文件,然后運(yùn)行該文件,如下所示:??./mvnw spring-boot:run?
???./mvnw clean package?
?
java -jar target/gs-accessing-data-rest-0.1.0.jar
此處描述的步驟將創(chuàng)建一個(gè)可運(yùn)行的 JAR。你也可以構(gòu)建經(jīng)典 WAR 文件. |
將顯示日志記錄輸出。該服務(wù)應(yīng)在幾秒鐘內(nèi)啟動(dòng)并運(yùn)行。
現(xiàn)在應(yīng)用程序正在運(yùn)行,您可以對(duì)其進(jìn)行測(cè)試。您可以使用任何您想要的 REST 客戶端。以下示例使用 *nix 工具 .??curl?
?
首先,您希望查看頂級(jí)服務(wù)。以下示例演示如何執(zhí)行此操作:
$ curl http://localhost:8080{ "_links" : { "people" : { "href" : "http://localhost:8080/people{?page,size,sort}", "templated" : true } }}
前面的示例提供了此服務(wù)器必須提供的功能的第一瞥。有一個(gè)鏈接位于 。它有一些選項(xiàng),例如、 和 。??people?
???http://localhost:8080/people?
????page?
????size?
????sort?
?
Spring Data REST 使用HAL 格式用于 JSON 輸出。它非常靈活,并提供了一種提供與所提供數(shù)據(jù)相鄰的鏈接的便捷方法。 |
以下示例演示如何查看人員記錄(目前無(wú)):
$ curl http://localhost:8080/people{ "_embedded" : { "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 }}
目前沒(méi)有元素,因此沒(méi)有頁(yè)面。是時(shí)候創(chuàng)建一個(gè)新的 !以下清單顯示了如何執(zhí)行此操作:??Person?
?
$ curl -i -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/1Content-Length: 0Date: Wed, 26 Feb 2014 20:26:55 GMT?
?-i?
?:確保您可以看到包含標(biāo)頭的響應(yīng)消息。將顯示新創(chuàng)建的 URI。Person
??-H "Content-Type:application/json"?
?:設(shè)置內(nèi)容類型,以便應(yīng)用程序知道有效負(fù)載包含 JSON 對(duì)象。??-d "{"firstName": "Frodo", "lastName": "Baggins"}"?
?:是否正在發(fā)送數(shù)據(jù)。如果您使用的是 Windows,則上面的命令將適用于唰唰??.如果無(wú)法安裝 WSL,則可能需要將單引號(hào)替換為雙引號(hào)并轉(zhuǎn)義現(xiàn)有的雙引號(hào),即 .-d "{\"firstName\": \"Frodo\", \"lastName\": \"Baggins\"}"
請(qǐng)注意對(duì)操作的響應(yīng)如何包含標(biāo)頭。這包含新創(chuàng)建的資源的 URI。Spring Data REST 還有兩個(gè)方法( 和 ),您可以使用它們來(lái)配置框架以立即返回剛剛創(chuàng)建的資源的表示。 是為創(chuàng)建和更新操作啟用制圖表達(dá)響應(yīng)的快捷方式方法。? |
您可以查詢所有人,如以下示例所示:
$ 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" : { "people" : [ { "firstName" : "Frodo", "lastName" : "Baggins", "_links" : { "self" : { "href" : "http://localhost:8080/people/1" } } } ] }, "page" : { "size" : 20, "totalElements" : 1, "totalPages" : 1, "number" : 0 }}
該對(duì)象包含一個(gè)列表,其中包括 。請(qǐng)注意它如何包含一個(gè)鏈接。Spring Data REST 也使用??people?
???Frodo?
???self?
?埃沃變形器復(fù)數(shù)化分組的實(shí)體名稱。
您可以直接查詢單個(gè)記錄,如下所示:
$ curl http://localhost:8080/people/1{ "firstName" : "Frodo", "lastName" : "Baggins", "_links" : { "self" : { "href" : "http://localhost:8080/people/1" } }}
這可能看起來(lái)純粹是基于 Web 的。但是,在幕后,有一個(gè) H2 關(guān)系數(shù)據(jù)庫(kù)。在生產(chǎn)中,你可能會(huì)使用一個(gè)真正的,比如PostgreSQL。 |
在本指南中,只有一個(gè)域?qū)ο蟆?duì)于更復(fù)雜的系統(tǒng),其中域?qū)ο蟊舜讼嚓P(guān),Spring Data REST呈現(xiàn)其他鏈接以幫助導(dǎo)航到連接的記錄。 |
您可以找到所有自定義查詢,如以下示例所示:
$ curl http://localhost:8080/people/search{ "_links" : { "findByLastName" : { "href" : "http://localhost:8080/people/search/findByLastName{?name}", "templated" : true } }}
您可以看到查詢的 URL,包括 HTTP 查詢參數(shù) 。請(qǐng)注意,這與界面中嵌入的注釋匹配。??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/1" } } } ] }}
由于已將其定義為在代碼中返回,因此它將返回所有結(jié)果。如果你已將其定義為僅返回,它將選取其中一個(gè)要返回的對(duì)象。由于這可能是不可預(yù)測(cè)的,因此您可能不希望對(duì)可以返回多個(gè)條目的查詢執(zhí)行此操作。??List
???Person?
???Person?
?
您還可以發(fā)出 、 和 REST 調(diào)用來(lái)替換、更新或刪除現(xiàn)有記錄(分別)。以下示例使用調(diào)用:??PUT?
???PATCH?
???DELETE?
???PUT?
?
$ curl -X PUT -H "Content-Type:application/json" -d "{"firstName": "Bilbo", "lastName": "Baggins"}" http://localhost:8080/people/1$ curl http://localhost:8080/people/1{ "firstName" : "Bilbo", "lastName" : "Baggins", "_links" : { "self" : { "href" : "http://localhost:8080/people/1" } }}
以下示例使用調(diào)用:??PATCH?
?
$ curl -X PATCH -H "Content-Type:application/json" -d "{"firstName": "Bilbo Jr."}" http://localhost:8080/people/1$ curl http://localhost:8080/people/1{ "firstName" : "Bilbo Jr.", "lastName" : "Baggins", "_links" : { "self" : { "href" : "http://localhost:8080/people/1" } }}
? |
您還可以刪除記錄,如以下示例所示:
$ curl -X DELETE http://localhost:8080/people/1$ 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 }}
這個(gè)超媒體驅(qū)動(dòng)接口的一個(gè)方便的方面是,你可以使用 curl(或任何你喜歡的 REST 客戶端)發(fā)現(xiàn)所有的 RESTful 端點(diǎn)。您無(wú)需與客戶交換正式合同或接口文檔。
祝賀!您開(kāi)發(fā)了一個(gè)應(yīng)用程序,其中包含基于超媒體RESTful 前端和基于 JPA 的后端。
標(biāo)簽: 應(yīng)用程序 您還可以 從頭開(kāi)始