App下載

簡(jiǎn)化RESTful開(kāi)發(fā),Spring Data REST減輕你的工作量

猿友 2020-08-08 15:02:19 瀏覽數(shù) (6718)
反饋

1.簡(jiǎn)介

SpringbootSpring MVC 簡(jiǎn)化了web應(yīng)用中的RESTful開(kāi)發(fā),然而還有一種更簡(jiǎn)單的,那就是Spring Data REST。Spring Data REST 建立在Data Repository之上,它可以直接把resositoryHATEOAS風(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> {
}

注解RepositoryRestResourceData REST用于暴露Repositorypath為訪問(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)如下:

Springboot應(yīng)用

我們用Postman做一個(gè)基本操作。

新增:

新增

查詢:

查詢

通過(guò)主鍵ID查詢:

通過(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#/如下:

訪問(wèn)結(jié)果

可以進(jìn)行CRUD操作,具體就不一一展示了。

以上就是關(guān)于Spring Data REST的介紹,它可以方便大家使用RESTful開(kāi)發(fā),希望對(duì)大家有所幫助,雖然項(xiàng)目中使用的機(jī)會(huì)并不大,但也可以擴(kuò)展一些知識(shí)面。

0 人點(diǎn)贊