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> 获取。
欢送关注微信公众号 <南瓜慢说>,将继续为你更新 …
多读书,多分享;多写作,多整顿。