1. 程式人生 > 實用技巧 >簡化RESTful開發,Spring Data REST讓你少掉髮

簡化RESTful開發,Spring Data REST讓你少掉髮

1 前言

歡迎訪問南瓜慢說 www.pkslow.com獲取更多精彩文章!

前言

Springboot + Spring MVC大大簡化了Web應用的RESTful開發,而Spring Data REST更簡單。Spring Data REST是建立在Data Repository之上的,它能直接把resositoryHATEOAS風格暴露成Web服務,而不需要再手寫Controller層。

HATEOAS,即Hypermedia as the Engine of Application State ,它是一種更成熟的REST模型,在資源的表達中包含了連結資訊,客戶端可以根據連結來發現可執行的動作。

Spring Data REST支援Spring Data JPASpring Data MongoDBSpring Data Neo4jSpring Data GenFireSpring 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 DatabaseH2資料庫,為了方便簡潔,使用該資料庫。

匯入後對應的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> {
}

註解RepositoryRestResourceData REST用於暴露Repositorypath為訪問路徑,設定為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": "[email protected]",
        "_links": {
          "self": {
            "href": "http://localhost:8080/user/33"
          },
          "user": {
            "href": "http://localhost:8080/user/33"
          }
        }
      },
      {
        "name": "pkslow.com",
        "age": 18,
        "email": "[email protected]",
        "_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的事件,如下:

  • 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='[email protected]'}
pkslow saving:User{id=32, name='pkslow.com', age=20, email='[email protected]'}
pkslow deleted:User{id=14, name='pkslow.com', age=18, email='[email protected]'}

說明事件成功執行,結合這個功能,可以實現很多業務邏輯,如刪除後記錄操作日誌,並刪除其它相關資料。

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>獲取。


歡迎關注微信公眾號<南瓜慢說>,將持續為你更新...

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