javascript
Spring Boot和Spring Data REST –通过REST公开存储库
使用Spring Boot和Spring Data REST,通過REST公開Spring Data存儲庫非常容易。 使用最少的代碼,您可以創建遵循HATEOAS原理的JPA實體的REST表示。 我決定重用Spring PetClinic的JPA實體(業務層)作為本文的基礎。
應用基礎
PetClinic的模型相對簡單,但是它包含一些單向和雙向關聯以及基本繼承:
此外,Spring的PetClinic為HSQLDB提供了SQL腳本,這使得在我的新應用程序中生成模式并用示例數據填充它非常容易。
項目依賴
作為配置的基礎,我使用了Spring Initializr并生成了一個基本的Gradle項目。 為了在Spring Boot應用程序中利用Spring Data REST,我添加了以下Boot Starters:
compile("org.springframework.boot:spring-boot-starter-web") compile("org.springframework.boot:spring-boot-starter-data-jpa") compile("org.springframework.boot:spring-boot-starter-data-rest")另外,我在項目中添加了HSQLDB依賴項:
compile("org.hsqldb:hsqldb:2.3.2")原始項目使用org.joda.time.DateTime作為日期字段,并使用org.jadira.usertype.dateandtime.joda.PersistentDateTime將其與Hibernate持久化。 為了能夠在新項目中使用它,我需要添加以下依賴項:
compile("joda-time:joda-time:2.4") compile("org.jadira.usertype:usertype.jodatime:2.0.1")使用API??時,我注意到盡管原始項目中的date字段使用Spring的@DateTimeFormat進行了注釋, @DateTimeFormat它們并未正確序列化。 我發現我需要使用@JsonFormatter ,因此另一個依賴項被添加到build.gradle :
compile("com.fasterxml.jackson.datatype:jackson-datatype-joda:2.4.2");進入類路徑后,Spring Boot將通過org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration自動配置com.fasterxml.jackson.datatype.joda.JodaModule 。
請注意,如果要正確序列化Java 8日期和時間類型,則需要向項目添加Jackson數據類型JSR310依賴項。
初始化數據庫
為了初始化數據源,我在src/main/resources添加了schema-hsqldb.sql和data-hsqldb.sql文件。 最后,我將幾個屬性添加到application.properties :
spring.datasource.platform = hsqldbspring.jpa.generate-ddl = falsespring.jpa.hibernate.ddl-auto = none現在,在應用程序啟動時,將自動拾取文件,并初始化數據源,并且由于有數據, 發現 API會容易得多!
儲存庫
Spring Data REST的一般思想是在Spring Data存儲庫的基礎上構建并自動將其導出為REST資源 。 我創建了幾個存儲庫,每個實體一個( OwnerRepository , PetRepository等)。 所有存儲庫都是從PagingAndSortingRepository擴展的Java接口。
在此階段不需要其他代碼:不需要@Controller ,不需要配置(除非需要自定義)。 Spring Boot將自動為我們配置所有內容。
運行應用程序
有了整個配置,就可以執行項目(您將在文章底部找到指向整個項目的鏈接)。 如果幸運的話,該應用程序將啟動,您可以導航到http://localhost:8080 ,它指向指向所有可用資源( 根資源 )的鏈接的集合。 響應的內容類型為。
哈爾
資源以Hypermedia樣式實現,默認情況下,Spring Data REST使用HAL和內容類型為application/hal+json來呈現響應。 HAL是一種簡單的格式,提供了一種鏈接資源的簡便方法。 例:
$ curl localhost:8080/owners/1 {"firstName" : "George","lastName" : "Franklin","_links" : {"self" : {"href" : "http://localhost:8080/owners/1"},"pets" : {"href" : "http://localhost:8080/owners/1/pets"}} }就Spring Data REST而言,有幾種類型的資源:集合,項目,搜索,查詢方法和關聯,并且都在響應中利用了application/hal+json內容類型。
館藏和物品資源
集合資源支持GET和POST方法。 項目資源通常支持GET , PUT , PATCH和DELETE方法。 注意, PATCH應用隨請求主體發送的值,而PUT替換資源。
搜索和查找方法資源
搜索資源返回存儲庫公開的所有查詢方法的鏈接,而查詢方法資源執行通過存儲庫界面上的單個查詢方法公開的查詢。 兩者都是只讀的,因此僅支持GET方法。
為了可視化,我向OwnerRepository添加了find方法:
List<Owner> findBylastName(@Param("lastName") String lastName);然后在http://localhost:8080/owners/search下公開:
$ curl http://localhost:8080/owners/search { "_links" : { "findBylastName" : { "href" : "http://localhost:8080/owners/search/findBylastName{?lastName}","templated" : true } } }協會資源
Spring Data REST自動公開子資源。 關聯資源支持GET , POST和PUT方法。
并允許對其進行管理。 使用關聯時,您需要了解文本/ uri-list內容類型。 具有這種內容類型的請求包含一個或多個URI( 每個URI應該出現在一行中,并且只有一行 )要添加到關聯中的資源。
在第一個示例中,我們將研究Vet類中的單向關系:
@ManyToMany(fetch = FetchType.EAGER) @JoinTable(name = "vet_specialties", joinColumns = @JoinColumn(name = "vet_id"),inverseJoinColumns = @JoinColumn(name = "specialty_id")) private Set<Specialty> specialties;為了將現有的專業添加到獸醫的專業集合中,必須執行PUT請求:
curl -i -X PUT -H "Content-Type:text/uri-list" -d $'http://localhost:8080/specialties/1\nhttp://localhost:8080/specialties/2' http://localhost:8080/vets/1/specialties可以使用DELETE方法刪除關聯,如下所示:
curl -i -X DELETE http://localhost:8080/vets/1/specialties/2讓我們看另一個例子:
// Owner @OneToMany(mappedBy = "owner", cascade = CascadeType.ALL, orphanRemoval = true) private Set<Pet> pets;// Pet @ManyToOne(cascade = CascadeType.ALL, optional = false) @JoinColumn(name = "owner_id") private Owner owner;設置寵物主人可以通過以下請求完成:
curl -i -X PUT -H "Content-Type:text/uri-list" -d "http://localhost:8080/owners/1" http://localhost:8080/pets/2/owner但是如何移除所有者呢? 由于必須始終為寵物設置所有者,因此在嘗試使用以下命令取消設置時,我們會收到HTTP/1.1 409 Conflict :
curl -i -X DELETE http://localhost:8080/pets/2/owner整合測試
使用Spring Boot,可以在測試中啟動Web應用程序,并使用Spring Boot的@IntegrationTest對其進行驗證。 我們將使用RestTemplate及其Spring Boot的實現來驗證實際的REST調用,而不是使用MockMvc服務器端Web應用程序上下文( MockMvc )。
眾所周知,資源的類型為application/hal+json 。 因此實際上,將它們直接反序列化為實體對象(例如Owner )是不可能的。 相反,必須將其反序列化為org.springframework.hateoas.Resource ,以包裝實體并為其添加鏈接。 而且,由于Resource是一個通用型ParameterizedTypeReference必須使用RestTemplate 。
以下示例將其可視化:
private RestTemplate restTemplate = new TestRestTemplate();@Test public void getsOwner() {String ownerUrl = "http://localhost:9000/owners/1";ParameterizedTypeReference<Resource<Owner>> responseType = new ParameterizedTypeReference<Resource<Owner>>() {};ResponseEntity<Resource<Owner>> responseEntity =restTemplate.exchange(ownerUrl, GET, null, responseType);Owner owner = responseEntity.getBody().getContent();assertEquals("George", owner.getFirstName());// more assertions}下一篇文章對此方法進行了很好的描述: 使用Spring RestTemplate和Super類型令牌使用Spring-hateoas Rest服務
摘要
通過幾個步驟以及Spring Boot和Spring Data REST的強大功能,我為現有PetClinic的數據庫創建了API。 使用Spring Data REST可以做更多的事情(例如自定義),除了文檔不多,與其他Spring項目相比,Spring Data REST似乎可以大大加快開發速度。 我認為,這是一個需要快速原型制作的好項目。
參考文獻
- 源代碼
- GitHub上的Spring Boot PetClinic API
- 說明文件:
- Spring Data REST
- 文章:
- 恢復您的JPA實體
翻譯自: https://www.javacodegeeks.com/2014/10/spring-boot-and-spring-data-rest-exposing-repositories-over-rest.html
總結
以上是生活随笔為你收集整理的Spring Boot和Spring Data REST –通过REST公开存储库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (tcp ip协议ddos)
- 下一篇: JSF的工作方式和调试方式–可以使用po