栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java > SpringBoot

简化RESTful开发,Spring Data REST让你少掉发

SpringBoot 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

简化RESTful开发,Spring Data REST让你少掉发

1 前言

欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章!

前言

Springboot + Spring MVC大大简化了Web应用的RESTful开发,而Spring Data REST更简单。Spring Data REST是建立在Data Repository之上的,它能直接把resository以HATEOAS风格暴露成Web服务,而不需要再手写Controller层。

HATEOAS,即Hypermedia as the Engine of Application State ,它是一种更成熟的REST模型,在资源的表达中包含了链接信息,客户端可以根据链接来发现可执行的动作。

Spring Data REST支持Spring Data JPA、Spring Data MongoDB、Spring Data Neo4j、Spring Data GenFire、Spring 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 Database:H2数据库,为了方便简洁,使用该数据库。

导入后对应的pom.xml中依赖如下:


  org.springframework.boot
  spring-boot-starter-web


  org.springframework.boot
  spring-boot-starter-data-jpa


  org.springframework.boot
  spring-boot-starter-data-rest


  com.h2database
  h2
  runtime

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 {
}

注解RepositoryRestResource是Data REST用于暴露Repository,path为访问路径,设置为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 {
}

其实就是多了两个方法findAll(Sort var1)和findAll(Pageable var1),如下所示:

public interface PagingAndSortingRepository extends CrudRepository {
    Iterable findAll(Sort var1);

    Page findAll(Pageable var1);
}

查询http://localhost:8080/user?page=1&size=2&sort=id,desc,表示查询第二页,每页2条记录,以ID倒序展示。如下:

{
  "_embedded": {
    "users": [
      {
 "name": "pkslow.com",
 "age": 18,
 "email": "pkslow@pkslow.com",
 "_links": {
   "self": {
     "href": "http://localhost:8080/user/33"
   },
   "user": {
     "href": "http://localhost:8080/user/33"
   }
 }
      },
      {
 "name": "pkslow.com",
 "age": 18,
 "email": "pkslow@pkslow.com",
 "_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 {

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

说明事件成功执行,结合这个功能,可以实现很多业务逻辑,如删除后记录操作日志,并删除其它相关数据。

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可以方便查看。

加入依赖:


  org.springframework.data
  spring-data-rest-hal-browser
  3.3.2.RELEASE

启动后访问http://localhost:8080/browser/index.html#/如下:

可以进行CRUD操作,具体就不一一展示了。

5 总结

本文介绍了Spring Data REST,可以方便大家进行RESTful服务开发。但据了解,项目中使用的并不多,简单学习一下,不失是一种了解Spring全家桶及架构理念的方式。

多读书,多分享;多写作,多整理。

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号