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