SpringBoot之:SpringBoot中使用HATEOAS

简介: HATEOAS是实现REST规范的一种原则,通过遵循HATEOAS规范,可以解决我们实际代码实现的各种个问题。作为java最流行的框架Spring当然也会不缺席HATEOAS的集成。本文将会通过一个具体的例子来讲解如何在SpringBoot中使用HATEOAS。

简介

HATEOAS是实现REST规范的一种原则,通过遵循HATEOAS规范,可以解决我们实际代码实现的各种个问题。作为java最流行的框架Spring

当然也会不缺席HATEOAS的集成。

本文将会通过一个具体的例子来讲解如何在SpringBoot中使用HATEOAS。

我们的目标

HATEOAS规则中,返回的数据会带有链接。我们以熟悉的Book为例,来展示这次的HATEOAS,首先创建一个Book entity:

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

我们希望能够通过下面的链接来获取到Book的详细数据:

GET /book/1

返回的数据如下:

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

可以看到在返回的数据中除了content包含了book的信息之外,还有一个_links属性,表示和该Book相关的资源链接。

构建Entity和Repository

在做任何数据之前,我们都需要构建相应的数据,也就是entity和对应的数据操作,为了简便起见,我们使用H2的内存数据库。

我们需要在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

然后配置对应的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);
}

同时,需要在resources中放置创建table的schema.sql和插入数据的data.sql。这样在程序启动的时候就可以自动创建相应的数据。

构建HATEOAS相关的RepresentationModel

如果要让自己来实现,也可以实现添加链接的操作,但是这样就太复杂了,还好我们有Spring。要在Spring中使用HATEOAS,需要进行如下配置:

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

如果我们想要对Book进行HATEOAS的构建,那么可以构建一个类,继承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封装了一个Book对象,并将其设置为json的content属性。

构建Controller

有了RepresentationModel,我们就可以使用它来构建HATEOAS的响应了。

我们看下面的例子:

@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来构建了一个HTTP请求,通过传入book的id来从数据库中查找相应的Book数据。

然后将其传入BookModel中,构建好RepresentationModel。这时候可以直接返回这个对象。但是我们还需要向其添加一些links。

我们使用bookModel.add来添加相应的link。并且使用linkTo方法来生成相应的link。

最后将RepresentationModel返回。

当我们请求/book/1的时候,就会得到最前面我们想要得到的json值。使用HATEOAS是不是很简单?

HATEOAS的意义

HATEOAS带有相应的资源链接,通过一个资源就可以得到从这个资源可以访问的其他的资源,就像是一个访问到一个页面,可以再通过这个页面去访问其他的页面一样。

所以HATEOAS的意义就在于我们只需要访问一个资源就可以遍历所有的资源。

我们通过测试来体验一下资源的访问。

首先,我们直接访问/book/1这个资源,来确认下得到的结果:

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

然后再通过Spring HATEOAS提供的Traverson类来进行链接的遍历:

@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");
    }

总结

很好,我们已经可以使用基本的HATEOAS了,本文例子可以参考:

learn-springboot2

目录
打赏
0
0
0
0
605
分享
相关文章
SpringBoot之:SpringBoot的HATEOAS基础
SpringBoot提供了HATEOAS的便捷使用方式,前面一篇文章我们也讲了如何在SpringBoot中使用HATEOAS。本文将会对这些内容进行扩展深入,详细讲解SpringBoot提供的这些基本方法。
基于Java+Springboot+Vue开发的服装商城管理系统
基于Java+Springboot+Vue开发的服装商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的服装商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
202 2
基于Java+Springboot+Vue开发的服装商城管理系统
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
208 1
SpringBoot项目部署打包好的React、Vue项目刷新报错404
本文讨论了在SpringBoot项目中部署React或Vue打包好的前端项目时,刷新页面导致404错误的问题,并提供了两种解决方案:一是在SpringBoot启动类中配置错误页面重定向到index.html,二是将前端路由改为hash模式以避免刷新问题。
364 1
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
137 62
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
110 13
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
133 2
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
基于Java+Springboot+Vue开发的大学竞赛报名管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的大学竞赛报名管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
244 3
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等