簡化RESTful開發,Spring Data REST讓你少掉發
1 前言
歡迎訪問南瓜慢說 www.pkslow.com獲取更多精彩文章!
前言
Springboot + Spring MVC
大大簡化了Web
應用的RESTful
開發,而Spring Data REST
更簡單。Spring Data REST
是建立在Data Repository
之上的,它能直接把resository
以HATEOAS
風格暴露成Web
服務,而不需要再手寫Controller
層。
HATEOAS
,即Hypermedia as the Engine of Application State ,它是一種更成熟的REST
模型,在資源的表達中包含了鏈接資訊,客戶端可以根據鏈接來發現可執行的動作。
Spring Data REST
支援Spring Data JPA
、Spring Data MongoDB
、Spring Data Neo4j
、Spring Data GenFire
、Spring Data Cassandra
,這裡選擇大家比較熟悉的JPA
。
2 舉個例子
我們用例子來感受一下吧。
2.1 創建項目
我們通過Spring Initializr來快速創建Springboot
項目。選中的依賴組件如下:
- (1)
Spring Web
:提供Web
服務; - (2)
Rest Repositories
:提供Spring Data REST
的支援; - (3)
Spring Data JPA
:通過JPA
提供Repository
方式的數據訪問; - (4)
H2 Database
:H2
資料庫,為了方便簡潔,使用該資料庫。
導入後對應的pom.xml
中依賴如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
2.2 實體類
創建一個實體類User
,如下所示:
package com.pkslow.rest.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String name;
private Integer age;
private String email;
//getter & setter
}
2.3 Repository介面定義
定義Repository
介面用於操作資料庫,如下所示:
package com.pkslow.rest.repo;
import com.pkslow.rest.entity.User;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
@RepositoryRestResource(path = "user")
public interface UserRepository extends CrudRepository<User, Integer> {
}
註解RepositoryRestResource
是Data REST
用於暴露Repository
,path
為訪問路徑,設置為user
,則訪問地址為//localhost:8080/user
。
2.4 啟動訪問
準備好以上程式碼,直接啟動Springboot
應用即可,我們把埠設置為8080
,訪問如下:
我們用Postman
做一個基本操作。
新增:
查詢:
通過主鍵ID
查詢:
修改:
刪除:
不難發現,返回的Json
都帶有鏈接,這就是HATEOAS
風格。
3 更多探索
3.1 分頁及排序功能
可以快速實現分頁及排序功能,只需要把Repository
的父介面改為PagingAndSortingRepository
即可,如下所示:
@RepositoryRestResource(path = "user")
public interface UserRepository extends PagingAndSortingRepository<User, Integer> {
}
其實就是多了兩個方法findAll(Sort var1)
和findAll(Pageable var1)
,如下所示:
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
Iterable<T> findAll(Sort var1);
Page<T> findAll(Pageable var1);
}
查詢//localhost:8080/user?page=1&size=2&sort=id,desc
,表示查詢第二頁,每頁2條記錄,以ID
倒序展示。如下:
{
"_embedded": {
"users": [
{
"name": "pkslow.com",
"age": 18,
"email": "pkslow@pkslow.com",
"_links": {
"self": {
"href": "//localhost:8080/user/33"
},
"user": {
"href": "//localhost:8080/user/33"
}
}
},
{
"name": "pkslow.com",
"age": 18,
"email": "pkslow@pkslow.com",
"_links": {
"self": {
"href": "//localhost:8080/user/32"
},
"user": {
"href": "//localhost:8080/user/32"
}
}
}
]
},
"_links": {
"first": {
"href": "//localhost:8080/user?page=0&size=2&sort=id,desc"
},
"prev": {
"href": "//localhost:8080/user?page=0&size=2&sort=id,desc"
},
"self": {
"href": "//localhost:8080/user?page=1&size=2&sort=id,desc"
},
"next": {
"href": "//localhost:8080/user?page=2&size=2&sort=id,desc"
},
"last": {
"href": "//localhost:8080/user?page=17&size=2&sort=id,desc"
},
"profile": {
"href": "//localhost:8080/profile/user"
}
},
"page": {
"size": 2,
"totalElements": 35,
"totalPages": 18,
"number": 1
}
}
可以發現page
是從0
開始的,1
表示第二頁;返回結果還提供了第一頁、上一頁、本頁、下一頁、最後一頁的鏈接;以及分頁資訊。
3.2 事件監聽
REST
提供了8個基於Repository
的事件,如下:
BeforeCreateEvent
AfterCreateEvent
BeforeSaveEvent
AfterSaveEvent
BeforeLinkSaveEvent
AfterLinkSaveEvent
BeforeDeleteEvent
AfterDeleteEvent
添加一個自定義事件如下:
package com.pkslow.rest.event;
import com.pkslow.rest.entity.User;
import org.springframework.data.rest.core.event.AbstractRepositoryEventListener;
import org.springframework.stereotype.Component;
@Component
public class PkslowEventListener extends AbstractRepositoryEventListener<User> {
@Override
public void onBeforeCreate(User entity) {
System.out.println("pkslow creating:" + entity);
}
@Override
public void onBeforeSave(User entity) {
System.out.println("pkslow saving:" + entity);
}
@Override
public void onAfterDelete(User entity) {
System.out.println("pkslow deleted:" + entity);
}
}
分別執行了增加、修改、刪除後,日誌如下:
pkslow creating:User{id=null, name='pkslow.com', age=18, email='pkslow@pkslow.com'}
pkslow saving:User{id=32, name='pkslow.com', age=20, email='pkslow@pkslow.com'}
pkslow deleted:User{id=14, name='pkslow.com', age=18, email='pkslow@pkslow.com'}
說明事件成功執行,結合這個功能,可以實現很多業務邏輯,如刪除後記錄操作日誌,並刪除其它相關數據。
3.3 路徑
默認基礎路徑是/
,可以通過spring.data.rest.base-path=api
進行配置,這樣就變成了localhost:8080/api/user
。
4 集成HAL Browser查看
HAL Browser是一個專門用於瀏覽基於JSON Hypertext Application Language
的前端工具。我們前面已經提供了HATEOAS
風格的RESTful
服務,HAL Browser
可以方便查看。
加入依賴:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-rest-hal-browser</artifactId>
<version>3.3.2.RELEASE</version>
</dependency>
啟動後訪問//localhost:8080/browser/index.html#/
如下:
可以進行CRUD
操作,具體就不一一展示了。
5 總結
本文介紹了Spring Data REST
,可以方便大家進行RESTful
服務開發。但據了解,項目中使用的並不多,簡單學習一下,不失是一種了解Spring
全家桶及架構理念的方式。
本文詳細程式碼可在南瓜慢說公眾號回復<SpringDataRest>獲取。
歡迎關注微信公眾號<南瓜慢說>,將持續為你更新…
多讀書,多分享;多寫作,多整理。