简化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
中依赖如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
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<User, Integer> {
}
注解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<User, Integer> {
}
其实就是多了两个方法findAll(Sort var1)
和findAll(Pageable var1)
,如下所示:
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
Iterable<T> findAll(Sort var1);
Page<T> 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<User> {
@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
可以方便查看。
加入依赖:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-rest-hal-browser</artifactId>
<version>3.3.2.RELEASE</version>
</dependency>
启动后访问http://localhost:8080/browser/index.html#/
如下:
可以进行CRUD
操作,具体就不一一展示了。
5 总结
本文介绍了Spring Data REST
,可以方便大家进行RESTful
服务开发。但据了解,项目中使用的并不多,简单学习一下,不失是一种了解Spring
全家桶及架构理念的方式。
本文详细代码可在南瓜慢说公众号回复<SpringDataRest>获取。
欢迎关注微信公众号<南瓜慢说>,将持续为你更新...
多读书,多分享;多写作,多整理。
简化RESTful开发,Spring Data REST让你少掉发的更多相关文章
- spring data jpa入门学习
本文主要介绍下spring data jpa,主要聊聊为何要使用它进行开发以及它的基本使用.本文主要是入门介绍,并在最后会留下完整的demo供读者进行下载,从而了解并且开始使用spring data ...
- 初探 spring data(一)--- spring data 概述
由于自己一个项目要用多到Sql与NoSql两种截然不同的数据结构,但在编程上我希望统一接口API,让不同类型的数据库能在相同的编程接口模式下运作.于是找了一个spring的官网,发现一个spring ...
- 63.JPA/Hibernate/Spring Data概念【从零开始学Spring Boot】
[从零开始学习Spirng Boot-常见异常汇总] 事情的起源,无意当中在一个群里看到这么一句描述:"有人么?默默的问一句,现在开发用mybatis还是hibernate还是jpa&quo ...
- 转:使用 Spring Data JPA 简化 JPA 开发
从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...
- 使用 Spring Data JPA 简化 JPA 开发
从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...
- 看Spring Data如何简化数据操作
Spring Data 概述 Spring Data 用于简化数据库访问,支持NoSQL 和 关系数据存储,其主要目标是使数据库的访问变得方便快捷. SpringData 项目所支持 NoSQL 存储 ...
- Spring Boot简化了基于Spring的应用开发
Spring Boot简化了基于Spring的应用开发,通过少量的代码就能创建一个独立的.产品级别的Spring应用. Spring Boot为Spring平台及第三方库提供开箱即用的设置,这样你就可 ...
- 16 搭建Spring Data JPA的开发环境
使用Spring Data JPA,需要整合Spring与Spring Data JPA,并且需要提供JPA的服务提供者hibernate,所以需要导入spring相关坐标,hibernate坐标,数 ...
- javaweb各种框架组合案例(六):springboot+spring data jpa(hibernate)+restful
一.介绍 1.springboot是spring项目的总结+整合 当我们搭smm,ssh,ssjdbc等组合框架时,各种配置不胜其烦,不仅是配置问题,在添加各种依赖时也是让人头疼,关键有些jar包之间 ...
随机推荐
- POJ 1063 Flip and Shift 最详细的解题报告
题目来源:Flip and Shift 题目大意:一个椭圆形的环形容器中有黑色和白色两种盘子,问你是否可以将黑色的盘子连续的放在一起.你可以有以下两种操作: 1.顺时针旋转所有的盘子 2.顺时针旋转3 ...
- 一张PDF了解JDK10 GC调优秘籍-附PDF下载
目录 简介 Java参数类型 Large Pages JIT调优 总结 简介 今天我们讲讲JDK10中的JVM GC调优参数,JDK10中JVM的参数总共有1957个,其中正式的参数有658个. 其实 ...
- Html笔试复习
掌握学习技巧,提高学习质量 学习目标:熟练掌握Html笔试复习题 已掌握目标:Html笔试复习题掌握95% 未完成目标:个别题因粗心造成错误,因选项意思不懂出错 解决方案:了解原因,因错出方案,充分利 ...
- js读取其他网页内容(同源)
通过xss第一次取得网页内容,然后获取到管理员账号页面进行二次盲打.js需要保留script部分其余去除. <html><p id='d1'></p> <sc ...
- web自动化 -- 三种等待方式
一.强制等待 二.隐式等待 注:隐式等待的作用域是全局,所以一般设置在整局代码的头几行. 如: 三.显示等待 元素存在: 元素可见: 元素可点击: 看到上图源码中有一个 element.is_en ...
- 理解k8s资源限制系列(二):cpu time
本文介绍几种在K8S中限制资源使用的几种方法. 资源类型 在K8S中可以对两类资源进行限制:cpu和内存. CPU的单位有: 正实数,代表分配几颗CPU,可以是小数点,比如0.5代表0.5颗CPU,意 ...
- yum下载软件包
方法一: downloadonly插件有一个yum的插件叫做downloadonly,就是只下载不安装的意思.1. 安装插件yum install yum-download2. 下载yum updat ...
- Android:沉浸式状态栏(二)集成
在Activity的onCreate()方法中添加代码 //设置状态栏透明 StatusBarUtil.setTranslucentStatus(this); //设置透明状态栏的paddingTop ...
- 部署SpringBoot到阿里云
目录 安装Mysql 1. 下载命令 2. 进行repo的安装: 3. 安装mysql 部署SpringBoot到阿里云服务器 1.IDEA下载插件 2.进入 Preference 配置一个 Acce ...
- SQL Server跟踪工具Profiler的使用
一.什么是SQL Profiler SQL Server Profiler 是一个功能丰富的界面,用于创建和管理跟踪并分析和重播跟踪结果. 事件保存在一个跟踪文件中,稍后试图诊断问题时,可以对该文件进 ...