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