第五十二章:基於SpringBoot2使用Rest訪問MongoDB資料

恆宇少年發表於2019-02-28

在之前專案中我們想要讀取MongoDB內的內容需要使用MongoDBTemplate來完成資料的CRUD,那如果我們想要通過RestController的形式獲取MongoDB內的資料就更麻煩了,還需要自行去建立對應的控制器,然後使用MongoDBTemplateMongoDB內讀取出資料後返回給前端。

在上一章節第五十一章:基於SpringBoot2 & MongoDB完成自動化整合我們講到了SpringBoot2MongoDB整合後怎麼簡單的運算元據,當然Spring Data Xxx家族方式的設計與Spring Data JPA一樣,Sring Data MongoDB提供了一個MongoRepository<T,PK>介面來為繼承該介面的子介面自動提供代理類完成資料操作實現。


本章目標

使用Spring Data Rest自動對映讀取MongoDB內的資料,省去一系列繁瑣的操作步驟。

為你推薦

  1. 第五十一章:基於SpringBoot2 & MongoDB完成自動化整合
  2. 第五十章:SpringBoot2.0新特性 – 豈止至今最簡單redis快取整合
  3. 第四十九章:SpringBoot2.0新特性 – 你get到WebMvcConfigurer兩種配置方式了嗎?
  4. 第四十八章:SpringBoot2.0新特性 – RabbitMQ信任package設定
  5. 第四十七章:SpringBoot2.0新特性 – Quartz自動化配置整合

SpringBoot 企業級核心技術學習專題


專題 專題名稱 專題描述
001 Spring Boot 核心技術 講解SpringBoot一些企業級層面的核心元件
002 Spring Boot 核心技術章節原始碼 Spring Boot 核心技術簡書每一篇文章碼雲對應原始碼
003 Spring Cloud 核心技術 對Spring Cloud核心技術全面講解
004 Spring Cloud 核心技術章節原始碼 Spring Cloud 核心技術簡書每一篇文章對應原始碼
005 QueryDSL 核心技術 全面講解QueryDSL核心技術以及基於SpringBoot整合SpringDataJPA
006 SpringDataJPA 核心技術 全面講解SpringDataJPA核心技術
007 SpringBoot核心技術學習目錄 SpringBoot系統的學習目錄,敬請關注點贊!!!

構建專案

使用Idea開發工具建立一個SpringBoot的專案,新增相應的依賴,pom.xml配置檔案依賴內容如下所示:

<dependencies>
        <!--mongodb依賴-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <!--data rest依賴-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--Lombok依賴-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
複製程式碼

我們本章節的依賴比上一章多了一個spring-boot-starter-data-rest,通過這個依賴我們可以自動完成RestController的依賴配置,不需要再手動去建立控制器,因為我們通過一些簡單的註解配置以及固定格式名稱規則的方法就可以完成控制器的實現。

因為本章的內容需要在上一章的基礎上編寫,所以我們直接把之前章節的相關的配置以及類都複製到本專案內,複製的內容有:application.ymlCustomerCustomerRepository。(原始碼位置:第五十一章原始碼)


改造CustomerRepository

spring-boot-starter-data-rest會自動掃描新增@RepositoryRestResource註解的介面,自動將該介面對映為一系列可通過rest訪問的請求路徑,這裡說到一系列,我們在測試的時候會講到為什麼說是一系列!!!
既然需要新增註解,那麼我們就開啟CustomerRepository介面,對應為它新增上如下註解內容:

@RepositoryRestResource(collectionResourceRel = "customer", path = "customer")
public interface CustomerRepository extends MongoRepository<Customer, String> {
//....省略
}
複製程式碼

註解內需要提供兩個引數,
collectionResourceRel:該引數配置對映MongoDB內的Collection名稱。
path:該引數配置對映完成rest後訪問的路徑字首。


執行測試

我們先來簡單的執行測試下是否可以通過我們配置的path路徑實現訪問內容,啟動專案時我們可以看到控制檯的輸出內容:

Mapped "{[/{repository}/search],methods=[GET]
Mapped "{[/{repository}/search/{search}],methods=[GET]
Mapped "{[/{repository}/{id}/{property}],methods=[GET]
Mapped "{[/{repository}],methods=[GET]
....
複製程式碼

我們配置一個@RepositoryRestResource註解的介面就會根據rest內建的一系列的條件生成對應的請求,這也是我們在之前說到的一系列請求路徑的地方,我們先來訪問下對映/{repository}的路徑。


測試 /{repository} 對映路徑

你如果使用Windows系統直接開啟瀏覽器輸出地址就可以看到返回的內容,如果你使用Linux或者OS X系統可以在Terminal使用curl命令檢視返回內容。

我們訪問:http://localhost:8080/customer,路徑檢視返回的內容:

➜  ~ curl http://localhost:8080/customer
{
  "_embedded" : {
    "customer" : [ {
      "firstName" : "恆宇",
      "lastName" : "少年",
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/customer/5adbec9ceb89f105acd90cec"
        },
        "customer" : {
          "href" : "http://localhost:8080/customer/5adbec9ceb89f105acd90cec"
        }
      }
    } ]
  },
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/customer{?page,size,sort}",
      "templated" : true
    },
    "profile" : {
      "href" : "http://localhost:8080/profile/customer"
    }
  },
  "page" : {
    "size" : 20,
    "totalElements" : 1,
    "totalPages" : 1,
    "number" : 0
  }
}
複製程式碼

通過這個地址我們可以讀取出@RepositoryRestResource註解配置的collectionResourceRel對應的 MongoDB.collection集合內的資料,我們發現不僅讀取出來了資料而且還為我們提供了分頁的資訊,這可是很貼心的地方啊,預設讀取第1頁每頁20條資料。


測試 /{repository}/{id} 對映路徑

我們訪問http://localhost:8080/customer/5adbec9ceb89f105acd90cec(注意:這裡的id是你本地生成的,這個id是我本地生成,直接訪問會出現404)如下所示:

➜  ~ curl http://localhost:8080/customer/5adbec9ceb89f105acd90cec
{
  "firstName" : "恆宇",
  "lastName" : "少年",
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/customer/5adbec9ceb89f105acd90cec"
    },
    "customer" : {
      "href" : "http://localhost:8080/customer/5adbec9ceb89f105acd90cec"
    }
  }
}
複製程式碼

根據返回的內容看到是能夠訪問根據id查詢的資料內容的。


測試 /{repository}/search/{search} 對映路徑

這個對映的配置是專門為我們自定義方法準備的,自定義方法的規則與SpringDataJPA的方法名稱規則一樣,當我們在介面建立findByXxx方法時Idea會自動為我們提示相應的內容,下面我們就建立兩個不同的查詢方法,如下所示:

    /**
     * 更加名字查詢資料
     *
     * @param firstName 名字
     * @return
     */
    List<Customer> findByFirstName(@Param("firstName") String firstName);

    /**
     * 根據姓氏查詢出最靠前的一條資料
     *
     * @param lastName 姓氏
     * @return
     */
    Customer findTopByLastName(@Param("lastName") String lastName);
複製程式碼

下面我們重啟下專案訪問路徑http://localhost:8080/customer/search/findByFirstName?firstName=恆宇可以看到返回內容:

➜  ~ curl http://localhost:8080/customer/search/findByFirstName?firstName=%E6%81%92%E5%AE%87
{
  "_embedded" : {
    "customer" : [ {
      "firstName" : "恆宇",
      "lastName" : "少年",
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/customer/5adbec9ceb89f105acd90cec"
        },
        "customer" : {
          "href" : "http://localhost:8080/customer/5adbec9ceb89f105acd90cec"
        }
      }
    } ]
  },
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/customer/search/findByFirstName?firstName=%E6%81%92%E5%AE%87"
    }
  }
}
複製程式碼

自動的根據我們的配置的方法查詢出了對應的資料,自動過濾了對應的資料,不過這個是沒有分頁的。
同樣另外一個自定義方法的請求http://localhost:8080/customer/search/findTopByLastName?lastName=少年,也是一樣的可以對應的獲取過濾後的資料。

注意:@Param註解內的引數名稱要與Customer內的屬性對應。

如果你想檢視配置的全部自定義的方法,訪問:http://localhost:8080/customer/search,如下所示:

➜  ~ curl http://localhost:8080/customer/search                                               
{
  "_links" : {
    "findByFirstName" : {
      "href" : "http://localhost:8080/customer/search/findByFirstName{?firstName}",
      "templated" : true
    },
    "findTopByLastName" : {
      "href" : "http://localhost:8080/customer/search/findTopByLastName{?lastName}",
      "templated" : true
    },
    "self" : {
      "href" : "http://localhost:8080/customer/search"
    }
  }
}
複製程式碼

總結

本章內容主要是圍繞著spring-boot-starter-data-rest這個依賴進行的,這個依賴幫助我們完成了日常編碼中一些重複的工作,而且很智慧的提供了一些對映,更方便我們進行查詢資料。

本章原始碼已經上傳到碼雲:
SpringBoot配套原始碼地址:gitee.com/hengboy/spr…
SpringCloud配套原始碼地址:gitee.com/hengboy/spr…
SpringBoot相關係列文章請訪問:目錄:SpringBoot學習目錄
QueryDSL相關係列文章請訪問:QueryDSL通用查詢框架學習目錄
SpringDataJPA相關係列文章請訪問:目錄:SpringDataJPA學習目錄,感謝閱讀!
歡迎加入QQ技術交流群,共同進步。

QQ技術交流群1

更新資源分享掃碼關注微信公眾號:

掃碼關注 - 專注分享

相關文章