1.簡介
Springboot
和 Spring MVC
簡化了web
應(yīng)用中的RESTful
開發(fā),然而還有一種更簡單的,那就是Spring Data REST
。Spring Data REST
建立在Data Repository
之上,它可以直接把resository
以HATEOAS
風(fēng)格暴露成Web
服務(wù),就不需要再手寫Controller
層。
HATEOAS
,即Hypermedia as the Engine of Application State
,它是一種更成熟的REST
模型,在資源的表達中包含了鏈接信息,客戶端可以根據(jù)鏈接來發(fā)現(xiàn)可執(zhí)行的動作。
Spring Data REST
支持Spring Data JPA
、Spring Data MongoDB
、Spring Data Neo4j
、Spring Data GenFire
、Spring Data Cassandra
,這里選擇大家比較熟悉的JPA
。
2 舉個例子
我們用例子來感受一下吧。
2.1 創(chuàng)建項目
我們通過Spring Initializr
來快速創(chuàng)建Springboot
項目。選中的依賴組件如下:
- (1)Spring Web:提供Web服務(wù);
- (2)Rest Repositories:提供
Spring Data REST
的支持; - (3)Spring Data JPA:通過
JPA
提供Repository
方式的數(shù)據(jù)訪問; - (4)H2 Database:H2數(shù)據(jù)庫,為了方便簡潔,使用該數(shù)據(jù)庫。
(推薦課程:Spring教程)
導(dǎo)入后對應(yīng)的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 實體類
創(chuàng)建一個實體類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
接口用于操作數(shù)據(jù)庫,如下所示:
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
為訪問路徑,設(shè)置為user
,則訪問地址為http://localhost:8080/user
。
2.4 啟動訪問
準備好以上代碼,直接啟動Springboot
應(yīng)用即可,我們把端口設(shè)置為8080,訪問如下:
我們用Postman
做一個基本操作。
新增:
查詢:
通過主鍵ID查詢:
修改:
刪除:
不難發(fā)現(xiàn),返回的Json
都帶有鏈接,這就是HATEOAS
風(fēng)格。
3 更多探索
3.1 分頁及排序功能
可以快速實現(xiàn)分頁及排序功能,只需要把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 } }
可以發(fā)現(xiàn)page
是從0開始的,1表示第二頁;返回結(jié)果還提供了第一頁、上一頁、本頁、下一頁、最后一頁的鏈接;以及分頁信息。
(推薦微課:Spring微課)
3.2 事件監(jiān)聽
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);
}
}
分別執(zhí)行了增加、修改、刪除后,日志如下:
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'}
說明事件成功執(zhí)行,結(jié)合這個功能,可以實現(xiàn)很多業(yè)務(wù)邏輯,如刪除后記錄操作日志,并刪除其它相關(guān)數(shù)據(jù)。
(推薦教程:Spring Boot 那些事)
3.3 路徑
默認基礎(chǔ)路徑是/
,可以通過spring.data.rest.base-path=api
進行配置,這樣就變成了localhost:8080/api/user
。
4 集成HAL Browser查看
HAL Browser
是一個專門用于瀏覽基于JSON Hypertext Application Language
的前端工具。我們前面已經(jīng)提供了HATEOAS
風(fēng)格的RESTful
服務(wù),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
操作,具體就不一一展示了。
以上就是關(guān)于Spring Data REST
的介紹,它可以方便大家使用RESTful
開發(fā),希望對大家有所幫助,雖然項目中使用的機會并不大,但也可以擴展一些知識面。