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,則訪問地址為http://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);
}
查詢http://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": "http://localhost:8080/user/33"
},
"user": {
"href": "http://localhost:8080/user/33"
}
}
},
{
"name": "pkslow.com",
"age": 18,
"email": "pkslow@pkslow.com",
"_links": {
"self": {
"href": "http://localhost:8080/user/32"
},
"user": {
"href": "http://localhost:8080/user/32"
}
}
}
]
},
"_links": {
"first": {
"href": "http://localhost:8080/user?page=0&size=2&sort=id,desc"
},
"prev": {
"href": "http://localhost:8080/user?page=0&size=2&sort=id,desc"
},
"self": {
"href": "http://localhost:8080/user?page=1&size=2&sort=id,desc"
},
"next": {
"href": "http://localhost:8080/user?page=2&size=2&sort=id,desc"
},
"last": {
"href": "http://localhost:8080/user?page=17&size=2&sort=id,desc"
},
"profile": {
"href": "http://localhost:8080/profile/user"
}
},
"page": {
"size": 2,
"totalElements": 35,
"totalPages": 18,
"number": 1
}
}
可以發現page是從0開始的,1表示第二頁;返回結果還提供了第一頁、上一頁、本頁、下一頁、最后一頁的鏈接;以及分頁信息。
3.2 事件監聽
REST提供了8個基於Repository的事件,如下:
BeforeCreateEventAfterCreateEventBeforeSaveEventAfterSaveEventBeforeLinkSaveEventAfterLinkSaveEventBeforeDeleteEventAfterDeleteEvent
添加一個自定義事件如下:
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>
啟動后訪問http://localhost:8080/browser/index.html#/如下:

可以進行CRUD操作,具體就不一一展示了。
5 總結
本文介紹了Spring Data REST,可以方便大家進行RESTful服務開發。但據了解,項目中使用的並不多,簡單學習一下,不失是一種了解Spring全家桶及架構理念的方式。
本文詳細代碼可在南瓜慢說公眾號回復<SpringDataRest>獲取。
歡迎關注微信公眾號<南瓜慢說>,將持續為你更新...

多讀書,多分享;多寫作,多整理。
