最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在SpringBoot中使用HATEOAS的方法

 更新時(shí)間:2022年05月19日 16:27:30   作者:程序那些事  
這篇文章主要介紹了在SpringBoot中使用HATEOAS的方法,HATEOAS是實(shí)現(xiàn)REST規(guī)范的一種原則,通過遵循HATEOAS規(guī)范,可以解決我們實(shí)際代碼實(shí)現(xiàn)的各種個(gè)問題,下文更多相關(guān)介紹,需要的小伙伴可以參考一下

簡(jiǎn)介

HATEOAS是實(shí)現(xiàn)REST規(guī)范的一種原則,通過遵循HATEOAS規(guī)范,可以解決我們實(shí)際代碼實(shí)現(xiàn)的各種個(gè)問題。作為java最流行的框架Spring
當(dāng)然也會(huì)不缺席HATEOAS的集成。

本文將會(huì)通過一個(gè)具體的例子來講解如何在SpringBoot中使用HATEOAS。

文章目標(biāo)

HATEOAS規(guī)則中,返回的數(shù)據(jù)會(huì)帶有鏈接。我們以熟悉的Book為例,來展示這次的HATEOAS,首先創(chuàng)建一個(gè)Book entity:

@Data
@Entity
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;
}

我們希望能夠通過下面的鏈接來獲取到Book的詳細(xì)數(shù)據(jù):

GET /book/1

返回的數(shù)據(jù)如下:

{
    "content": {
        "id": 1,
        "title": "The Hobbit"
    },
    "_links": {
        "self": {
            "href": "http://localhost:8080/book/1"
        }
    }
}

可以看到在返回的數(shù)據(jù)中除了content包含了book的信息之外,還有一個(gè)_links屬性,表示和該Book相關(guān)的資源鏈接。

構(gòu)建Entity和Repository

在做任何數(shù)據(jù)之前,我們都需要構(gòu)建相應(yīng)的數(shù)據(jù),也就是entity和對(duì)應(yīng)的數(shù)據(jù)操作,為了簡(jiǎn)便起見,我們使用H2的內(nèi)存數(shù)據(jù)庫(kù)。

我們需要在application.properties中配置如下:

spring.jpa.hibernate.ddl-auto=validate
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

然后配置對(duì)應(yīng)的repository :

public interface BookRepository extends CrudRepository<Book, Long> {
    long deleteByTitle(String title);

    @Modifying
    @Query("delete from Book b where b.title=:title")
    void deleteBooks(@Param("title") String title);
}

同時(shí),需要在resources中放置創(chuàng)建table的schema.sql和插入數(shù)據(jù)的data.sql。這樣在程序啟動(dòng)的時(shí)候就可以自動(dòng)創(chuàng)建相應(yīng)的數(shù)據(jù)。

構(gòu)建HATEOAS相關(guān)的RepresentationModel

如果要讓自己來實(shí)現(xiàn),也可以實(shí)現(xiàn)添加鏈接的操作,但是這樣就太復(fù)雜了,還好我們有Spring。

要在Spring中使用HATEOAS,需要進(jìn)行如下配置:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-hateoas</artifactId>
        </dependency>

如果我們想要對(duì)Book進(jìn)行HATEOAS的構(gòu)建,那么可以構(gòu)建一個(gè)類,繼承RepresentationModel即可:

public class BookModel extends RepresentationModel<BookModel> {
    private final Book content;
    @JsonCreator
    public BookModel(@JsonProperty("content") Book content) {
        this.content = content;
    }
    public Book getContent() {
        return content;
    }
}

上面的例子中,我們用RepresentationModel封裝了一個(gè)Book對(duì)象,并將其設(shè)置為json的content屬性。

構(gòu)建Controller

有了RepresentationModel,我們就可以使用它來構(gòu)建HATEOAS的響應(yīng)了。

我們看下面的例子:

	@RequestMapping("/book/{id}")
	public HttpEntity<Book> getBook(@PathVariable("id") Long id) {
		Book book= bookRepository.findById(id).get();
		BookModel bookModel = new BookModel(book);
		bookModel.add(linkTo(methodOn(BookController.class).getBook(id)).withSelfRel());
		return new ResponseEntity(bookModel, HttpStatus.OK);
	}

上面的例子中,我們使用@RequestMapping來構(gòu)建了一個(gè)HTTP請(qǐng)求,通過傳入book的id來從數(shù)據(jù)庫(kù)中查找相應(yīng)的Book數(shù)據(jù)。

然后將其傳入BookModel中,構(gòu)建好RepresentationModel。這時(shí)候可以直接返回這個(gè)對(duì)象。但是我們還需要向其添加一些links。

我們使用bookModel.add來添加相應(yīng)的link。并且使用linkTo方法來生成相應(yīng)的link。最后將RepresentationModel返回。當(dāng)我們請(qǐng)求/book/1的時(shí)候,就會(huì)得到最前面我們想要得到的json值。使用HATEOAS是不是很簡(jiǎn)單?

HATEOAS的意義

HATEOAS帶有相應(yīng)的資源鏈接,通過一個(gè)資源就可以得到從這個(gè)資源可以訪問的其他的資源,就像是一個(gè)訪問到一個(gè)頁(yè)面,可以再通過這個(gè)頁(yè)面去訪問其他的頁(yè)面一樣。所以HATEOAS的意義就在于我們只需要訪問一個(gè)資源就可以遍歷所有的資源。我們通過測(cè)試來體驗(yàn)一下資源的訪問。

首先,我們直接訪問/book/1這個(gè)資源,來確認(rèn)下得到的結(jié)果:

    @Test
    void envEndpointNotHidden() throws Exception {
        mockMvc.perform(get("/book/1"))
                .andExpect(jsonPath("$.content.title").value("The Hobbit"));
    }

然后再通過Spring HATEOAS提供的Traverson類來進(jìn)行鏈接的遍歷:

	@Test
	void envEndpointNotHidden() throws Exception {
		Traverson traverson = new Traverson(new URI("http://localhost:" + this.port + "/book/1"), MediaTypes.HAL_JSON);
		String bookTitle = traverson.follow("self").toObject("$.content.title");
		assertThat(bookTitle).isEqualTo("The Hobbit");
	}

到此這篇關(guān)于在SpringBoot中使用HATEOAS的方法的文章就介紹到這了,更多相關(guān)SpringBoot使用HATEOAS內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring?Boot?微服務(wù)中集成?MyBatis-Plus?與集成原生?MyBatis在配置上的不同

    Spring?Boot?微服務(wù)中集成?MyBatis-Plus?與集成原生?MyBatis在配置上的不同

    在Spring?Boot微服務(wù)中,MyBatis-Plus通過其Boot?Starter和豐富的配置屬性,極大的簡(jiǎn)化了MyBatis的集成和配置工作,尤其是對(duì)于全局設(shè)置和常用插件的使用,本文給大家介紹Spring?Boot?微服務(wù)中集成?MyBatis-Plus與集成原生?MyBatis?有哪些配置上的不同,感興趣的朋友一起看看吧
    2025-04-04
  • Java使用HashMap實(shí)現(xiàn)并查集

    Java使用HashMap實(shí)現(xiàn)并查集

    這篇文章主要為大家詳細(xì)介紹了Java使用HashMap實(shí)現(xiàn)并查集,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • SpringBoot數(shù)據(jù)校驗(yàn)功能的實(shí)現(xiàn)

    SpringBoot數(shù)據(jù)校驗(yàn)功能的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot數(shù)據(jù)校驗(yàn)功能的實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • IntelliJ IDEA中代碼一鍵生成方法

    IntelliJ IDEA中代碼一鍵生成方法

    EasyCode 是基于 IntelliJ IDEA 開發(fā)的代碼生成插件,支持自定義任意模板(Java,html,js,xml),這篇文章主要介紹了IntelliJ IDEA中代碼一鍵生成方法,需要的朋友可以參考下
    2020-02-02
  • Java手動(dòng)配置線程池過程詳解

    Java手動(dòng)配置線程池過程詳解

    這篇文章主要介紹了Java手動(dòng)配置線程池過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 使用Java校驗(yàn)SQL語句的合法性五種解決方案

    使用Java校驗(yàn)SQL語句的合法性五種解決方案

    這篇文章主要介紹了如何用java校驗(yàn)SQL語句的合法性(提供五種解決方案),使用JDBC?API和JSqlParser庫(kù)、正則表達(dá)式、ANTLR解析器生成器或Apache?Calcite庫(kù)都可以實(shí)現(xiàn)校驗(yàn)SQL語句的合法性,需要的朋友可以參考下
    2023-04-04
  • 關(guān)于maven pom文件配置加載lib下的jar包

    關(guān)于maven pom文件配置加載lib下的jar包

    在項(xiàng)目中引用放置在lib文件夾中的第三方j(luò)ar包需要通過POM文件進(jìn)行特定配置,雖然將依賴放置在公司的Maven私服是更好的做法,但如果遇到部署問題,可以利用maven-jar-plugin進(jìn)行配置,Spring Boot項(xiàng)目可以通過特定設(shè)置來實(shí)現(xiàn)
    2024-09-09
  • 最簡(jiǎn)單的Spring Cloud教程第一篇:服務(wù)的注冊(cè)與發(fā)現(xiàn)(Eureka)

    最簡(jiǎn)單的Spring Cloud教程第一篇:服務(wù)的注冊(cè)與發(fā)現(xiàn)(Eureka)

    這篇文章主要給大家介紹了關(guān)于Spring Cloud服務(wù)的注冊(cè)與發(fā)現(xiàn)(Eureka)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring cloud具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-08-08
  • java實(shí)現(xiàn)小球碰撞功能

    java實(shí)現(xiàn)小球碰撞功能

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)小球碰撞功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • Java?Thread?類和Runnable?接口詳解

    Java?Thread?類和Runnable?接口詳解

    這篇文章主要介紹了Java?Thread?類和Runnable接口詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-08-08

最新評(píng)論

奉贤区| 紫金县| 四川省| 大英县| 临邑县| 东乡县| 礼泉县| 湘乡市| 永修县| 遂宁市| 安溪县| 阿克苏市| 诏安县| 佛学| 定日县| 郯城县| 桂东县| 易门县| 广昌县| 鱼台县| 屯门区| 凤山县| 渭源县| 临漳县| 三明市| 东山县| 平度市| 汕尾市| 安陆市| 县级市| 长武县| 隆安县| 福建省| 安西县| 佳木斯市| 桦甸市| 于田县| 日土县| 武平县| 滨海县| 林周县|