Spring Boot之@RepositoryRestResource注解入門使用教程

1、Overview

廢話不多說直接上代碼锋谐,在代碼中解釋如何入門使用遍尺。

2、Build with Maven

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.springframework</groupId>
    <artifactId>gs-accessing-data-rest</artifactId>
    <version>0.1.0</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.2.RELEASE</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-releases</id>
            <url>https://repo.spring.io/libs-release</url>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>spring-releases</id>
            <url>https://repo.spring.io/libs-release</url>
        </pluginRepository>
    </pluginRepositories>
</project>

3涮拗、Create a domain object

目錄:
src/main/java/hello/Person.java

代碼:

package hello;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    private String firstName;
    private String lastName;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

Person有一個firstName和lastName乾戏,主鍵id配置成自動生成迂苛。

4、Create a Person repository

創(chuàng)建一個簡單的repository類

package hello;

import java.util.List;

import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;

@RepositoryRestResource(collectionResourceRel = "people", path = "people")
public interface PersonRepository extends PagingAndSortingRepository<Person, Long> {

    List<Person> findByLastName(@Param("name") String name);

}

PersonRepository是一個繼承PagingAndSortingRepository的interface鼓择,然后三幻,你就可以對Person對象進行各種操作。

在程序運行的時候惯退,Spring Data REST將自動創(chuàng)建此接口的實現(xiàn)赌髓。然后,它將使用@RepositoryRestResource注解讓Spring MVC在/people處創(chuàng)建RESTful入口點催跪。

在這里锁蠕,您還可以加入一個自定義查詢,傳入lastName參數(shù)來檢索Person對象的列表懊蒸,稍后我會將介紹如何詳細使用荣倾。

5、Make the application executable

目錄:

src/main/java/hello/Application.java

代碼:

package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

這里就不需要我詳細解釋了吧骑丸?使用過SpringBoot的人基本知道了舌仍。

6、Test the application

運行這個Web程序通危,然后進入http://localhost:8080會顯示如下信息:

$ curl http://localhost:8080

{
  "_links" : {
    "people" : {
      "href" : "http://localhost:8080/people{?page,size,sort}",
      "templated" : true
    }
  }
}

在這里你能看到服務(wù)器提供給你的基本信息铸豁,能看到剛才我們所定義的people所在地址http://localhost:8080/people,它還提供了一些選項:?page,?size,?sort菊碟。

注意:Spring Data REST的JSON輸出格式使用的是HAL格式节芥。


現(xiàn)在我們進入這個URL地址:http://localhost:8080/people,看下服務(wù)器是如何輸出的逆害。

$ curl http://localhost:8080/people

{
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/people{?page,size,sort}",
      "templated" : true
    },
    "search" : {
      "href" : "http://localhost:8080/people/search"
    }
  },
  "page" : {
    "size" : 20,
    "totalElements" : 0,
    "totalPages" : 0,
    "number" : 0
  }
}

由輸出可見头镊,數(shù)據(jù)庫中暫無任何Person對象的信息,現(xiàn)在我們開始新建一個對象:

$ curl -i -X POST -H "Content-Type:application/json" -d '{  "firstName" : "Frodo",  "lastName" : "Baggins" }' http://localhost:8080/people

HTTP/1.1 201 Created
Server: Apache-Coyote/1.1
Location: http://localhost:8080/people/1
Content-Length: 0
Date: Wed, 13 Dec 2016 14:26:55 GMT

-i 顯示請求頭信息
-X POST : 利用POST創(chuàng)建一個新的實體
-H "Content-Type:application/json" : 設(shè)置內(nèi)容類型, 讓應(yīng)用程序知道你要傳輸?shù)膬?nèi)容是JSON還是XML
-d '{ "firstName" : "Frodo", "lastName" : "Baggins" }' 一個數(shù)據(jù)包魄幕,要發(fā)送給應(yīng)用程序的數(shù)據(jù)相艇。


$ curl http://localhost:8080/people

{
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/people{?page,size,sort}",
      "templated" : true
    },
    "search" : {
      "href" : "http://localhost:8080/people/search"
    }
  },
  "_embedded" : {
    "persons" : [ {
      "firstName" : "Frodo",
      "lastName" : "Baggins",
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/people/1"
        }
      }
    } ]
  },
  "page" : {
    "size" : 20,
    "totalElements" : 1,
    "totalPages" : 1,
    "number" : 0
  }
}

personsJSON數(shù)組現(xiàn)在就包含了所有Person對象的列表。其中也包含了這條消息的self連接地址纯陨,也就是你可以直接查詢單個記錄的詳細信息坛芽,現(xiàn)在就讓我們訪問一下看下結(jié)果。

$ curl http://localhost:8080/people/1

{
  "firstName" : "Frodo",
  "lastName" : "Baggins",
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/people/1"
    }
  }
}

查找所有自定義查詢:

$ curl http://localhost:8080/people/search

{
  "_links" : {
    "findByLastName" : {
      "href" : "http://localhost:8080/people/search/findByLastName{?name}",
      "templated" : true
    }
  }
}

通過返回結(jié)果队丝,我們能看見之前定義的findByLastName接口靡馁,給name參數(shù)傳入一個值,就可以達到查詢功能机久。

$ curl http://localhost:8080/people/search/findByLastName?name=Baggins

{
  "_embedded" : {
    "persons" : [ {
      "firstName" : "Frodo",
      "lastName" : "Baggins",
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/people/1"
        }
      }
    } ]
  }
}

因為我們之前在代碼里面定義的返回結(jié)果是一個List<Person>類型臭墨,所以它將返回所有符合條件的結(jié)果。如果你在代碼里定義返回結(jié)果為Person膘盖,程序會選擇一個Person對象進行返回胧弛。


除此之外尤误,我們還可以使用PUTPATCH结缚、DELETE請求方式损晤,來進行替換、更新或刪除現(xiàn)有記錄的操作

$ curl -X PUT -H "Content-Type:application/json" -d '{ "firstName": "Bilbo", "lastName": "Baggins" }' http://localhost:8080/people/1
$ curl http://localhost:8080/people/1

輸出內(nèi)容:
{
  "firstName" : "Bilbo",
  "lastName" : "Baggins",
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/people/1"
    }
  }
}

$ curl -X PATCH -H "Content-Type:application/json" -d '{ "firstName": "Bilbo Jr." }' http://localhost:8080/people/1
$ curl http://localhost:8080/people/1

輸出內(nèi)容:
{
  "firstName" : "Bilbo Jr.",
  "lastName" : "Baggins",
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/people/1"
    }
  }
}

注意:如果你使用PUT命令红竭,它將替換整個記錄尤勋,如果有字段沒有提供值,它將置為null茵宪。PATCH反之最冰。

你也可以刪除記錄:

$ curl -X DELETE http://localhost:8080/people/1
$ curl http://localhost:8080/people

{
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/people{?page,size,sort}",
      "templated" : true
    },
    "search" : {
      "href" : "http://localhost:8080/people/search"
    }
  },
  "page" : {
    "size" : 20,
    "totalElements" : 0,
    "totalPages" : 0,
    "number" : 0
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市稀火,隨后出現(xiàn)的幾起案子暖哨,更是在濱河造成了極大的恐慌,老刑警劉巖凰狞,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件篇裁,死亡現(xiàn)場離奇詭異,居然都是意外死亡赡若,警方通過查閱死者的電腦和手機达布,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逾冬,“玉大人往枣,你說我怎么就攤上這事》矍” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵圾另,是天一觀的道長霸株。 經(jīng)常有香客問我,道長集乔,這世上最難降的妖魔是什么去件? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮扰路,結(jié)果婚禮上尤溜,老公的妹妹穿的比我還像新娘。我一直安慰自己汗唱,他們只是感情好宫莱,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著哩罪,像睡著了一般授霸。 火紅的嫁衣襯著肌膚如雪巡验。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天碘耳,我揣著相機與錄音显设,去河邊找鬼。 笑死辛辨,一個胖子當(dāng)著我的面吹牛捕捂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播斗搞,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼指攒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了榜旦?” 一聲冷哼從身側(cè)響起幽七,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎溅呢,沒想到半個月后澡屡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡咐旧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年驶鹉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铣墨。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡室埋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出伊约,到底是詐尸還是另有隱情姚淆,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布屡律,位于F島的核電站腌逢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏超埋。R本人自食惡果不足惜搏讶,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望霍殴。 院中可真熱鬧媒惕,春花似錦萨西、人聲如沸嘶窄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽荠卷。三九已至瘦穆,卻和暖如春棚点,著一層夾襖步出監(jiān)牢的瞬間冲甘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工叁鉴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留土涝,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓幌墓,卻偏偏與公主長得像但壮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子常侣,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容