构建RESTful服务(使用Spring Data JPA)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构建RESTful服务(使用Spring Data JPA)相关的知识,希望对你有一定的参考价值。

一.Restful简介
REST是一种Web软件结构风格,而不是一种标准,匹配或兼容这种架构风格称之为REST服务,REST服务简洁并且有层次,REST通常基于HTTP,URI和XML以及html这些现有的广泛流行的协议和标准,在REST中,资源是由URI来指定的,对资源的增删改查也是通过HTTP协议提供的POST,PUT,GET,DELETE等方法实现,使用REST可以更高效率的利用缓存来提高响应速度,同时REST中的通信会话状态有客户端来维护,这可以让不同服务器来处理一系列请求中的不同请求,进而提高服务器的扩展性,在前后端分离项目中,一个好的项目必然遵循REST架构风格
在Spring Mvc框架中,开发者可以提供RestController注解开发一个RESTful服务,不过Spring Boot对此提供了自动化配置方案,开发者只需要添加相关依赖即可快速构建一个RESTful服务
二.JPA实现REST
在Spring Boot中使用Spring Data JPA和Spring Data Rest可以快速开发一个RESTful服务。
1.基本实现
(1)创建项目:创建Spring Boot项目,添加如下依赖

<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>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>
         <!--lombok插件-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency> 

(2)这里的依赖除了添加了数据库相关依赖外还有Spring Data Jpa以及Spring Data Rest的依赖,项目建成后,接下来在配置文件中进行配置,配置如下:

server.port=8088

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/spring_vue?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=false
spring.datasource.username=root
spring.datasource.password=********

spring.jpa.hibernate.ddl-auto=update
spring.jpa.database=mysql
spring.jpa.show-sql=true
spring.jpa.open-in-view=true
spring.jpa.properties.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

2.创建实体类

@Entity
@Data
@Table(name = "book")
public class Book 

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;

    @Column(name = "name")
    private String name;

    @Column(name = "author")
    private String author;

    @Column(name = "price")
    private float price;

3.创建BookRepository

public interface BookRepository extends JpaRepository<Book, Integer>, JpaSpecificationExecutor

(3)这里继承了JpaRepository,JpaSpecificationExecutor,在JpaRepository中包含了很多现成的增删改查的方法
4.测试
经过上面的步骤,简单的RESTful架构就已经完成了,接下来进行测试:
(1)添加测试,这里我们使用的Postman,RESTful构建成功后,默认的请求路径是实体类名小名加上s,向数据库添加一条数据很容易,发起一个post请求,并写入要添加的数据即可,这里数据以JSON格式为准,如下:

技术图片

总结:路径:localhost:8088/books,格式:JSON,请求类型:post
(2)分页查询测试,查询是Get请求,分页查询请求路径实体类小写加s,这里为/books,分页查询的每页默认记录数为20条,页数是0,测试如下:

技术图片

总结:请求类型GET,无参数,路径:localhost:8088/books
(3)根据id查询,若是根据id进行查询,只需要路径后边缀id即可,路径如下:

技术图片

总结:路径:localhost:8088/books/4,类型:GET
(4)分页查询扩展,添加查询页数,条数,以及添加排序,也是只需要后缀参数即可
技术图片

总结:路径:localhost:8088/books?page=1&size=3,请求类型:GET
除了分页以外还可以添加排序,如下:

技术图片

总结:路径:localhost:8088/books?page=1&size=3&sort=id,desc,类型:GET
(5)修改测试,修改需要发送PUT请求,因为修改是根据id进行的,因此路径中需加入id,然后传入修改数据(JSON格式),如下:
技术图片

总结:路径:localhost:8088/books/15,请求参数图中所示,请求类型:PUT
(6)删除测试,使用DELETE请求可以实现对数据的删除操作,例如删除id为1的记录,路由如下:localhost:8088/books/11
5.自定义请求路径
默认情况下,请求路径都是实体类名加s,如果开发者想对路径进行重定义,通过@RepositoryResource注解可实现

@RepositoryRestResource(path="bs",collectionResourceRel="bs",itemResourceRel="bs")
public interface BookRepository extends JpaRepository<Book, Integer>, JpaSpecificationExecutor

代码解释:@RepositoryResource注解的path属性表示将所有请求路径中的books都修改为bs(localhost:8088/bs),collectionResourceRel表示将返回的JSON集合中book集合的key修改为bs,itemResourceRel表示将返回的JSON集合中单个book的key修改为b

技术图片

6.自定义查询方法
默认的查询方法支持分页查询,排序查询以及按照id查询,如果开发者想要按照某个属性查询,只需要在BookRepository中定义相关方法并暴露出去即可,代码如下:

@RepositoryRestResource(path = "bs")
public interface BookRepository extends JpaRepository<Book, Integer>, JpaSpecificationExecutor 
    @RestResource(path = "author", rel = "author")
    public List<Book> findByAuthor(@Param("author") String author);

代码解释:
自定义查询只需要在BookRepository中定义查询方法即可,方法定义好之后可以不添加@RestResource注解,默认路径就是方法名,以上述自定义方法为例,若是不添加@RestResource注解,则默认该方法调用路径为:localhost:8088/bs/search/findByAuthor?author=金庸,如果添加注解,对方法查询路径自定义,其中path就是最新路径,如上方法,他的访问路径为:localhost:8088/bs/search//author?author=金庸 ,如下:

技术图片

注意:用户可以通过访问:localhost:8088/bs/search,查询目前都暴露了哪些查询方法

7.隐藏方法
(1)默认情况下,继承了Repository接口或是其子类的类都会被暴露出来,即开发者可以执行基本的增删改查方法,如果开发者不想暴露此接口类对对象的操作各种方法,那么就可以作如下配置:

@RepositoryRestResource(exported=false)
public interface BookRepository extends JpaRepository<Book, Integer>, JpaSpecificationExecutor 

这样此接口里边的所有方法都会失效
(2)若是只是不想暴露某一个方法,就可以在此方法上加注解@RestResource,在注解中设定exported=false,这样这个方法就会失效,如下:

@Override
    @RestResource(exported=false)
    void deleteById(Integer id);

8.配置CORS(跨域支持)
所有方法支持跨域访问,在接口上加@CrossOrigin注解如下:

@CrossOrigin
@RepositoryRestResource(path = "bs")
public interface BookRepository extends JpaRepository<Book, Integer>, JpaSpecificationExecutor 
    @RestResource(path = "author", rel = "author")
    public List<Book> findByAuthor(@Param("author") String author);

(2)单某些方法支持跨域,在要支持的方法上加@CrossOrigin注解
9.其他配置
开发者可以为了方便开发添加常用属性,如下:

spring.data.rest.default-page-size=2
spring.data.rest.page-param-name=path
spring.data.rest.sort-param-name=sort
spring.data.rest.limit-param-name=size
spring.data.rest.base-path=/api
spring.data.rest.return-body-on-create=true
spring.data.rest.return-body-on-update=true

以上是关于构建RESTful服务(使用Spring Data JPA)的主要内容,如果未能解决你的问题,请参考以下文章

Spring Webflux 构建响应式 Restful Web 服务

Spring Webflux 构建响应式 Restful Web 服务

Spring Webflux 构建响应式 Restful Web 服务

Spring Webflux 构建响应式 Restful Web 服务

使用 Spring Boot Actuator 构建 RESTful Web 服务

Spring Boot 构建一个RESTful Web服务