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

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>获取。


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

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理