关于java:简化RESTful开发Spring-Data-REST让你少掉发

35次阅读

共计 5009 个字符,预计需要花费 13 分钟才能阅读完成。

1 前言

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

前言

Springboot + Spring MVC大大简化了 Web 利用的 RESTful 开发,而 Spring Data REST 更简略。Spring Data REST是建设在 Data Repository 之上的,它能间接把 resositoryHATEOAS格调裸露成 Web 服务,而不须要再手写 Controller 层。

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

Spring Data REST反对Spring Data JPASpring Data MongoDBSpring Data Neo4jSpring Data GenFireSpring 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 DatabaseH2数据库,为了不便简洁,应用该数据库。

导入后对应的 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> {}

注解 RepositoryRestResourceData REST用于裸露 Repositorypath 为拜访门路,设置为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> 获取。


欢送关注微信公众号 <南瓜慢说>,将继续为你更新 …

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

正文完
 0