使用Spring Data自动创建repository实现及自动定义API实现

  使用Spring Data REST将会自动为集成Spring Data的项目暴露API接口。

 

⒈,创建集成Spring Data项目【略】

  Spring Data能够基于我们定义的接口自动创建repository实现。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

 

⒉为Spring Data项目集成Spring Data REST

  Spring Data REST是Spring Data家族中的另外一个成员,它会为Spring Data创建的repository自动生成 REST API,我们只需要将Spring Data REST添加到构建文件中,就能得到一套API,它的操作与我们定义的repository接口是一致的。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>

  当添加完成此依赖后,对于已经使用Spring Data自动生成repository的项目来说,只需要完成这一步就能对外暴露REST API了,将Spring Data REST starter添加到构建文件中之后,应用的自动装配功能会为Spring Data(包括Spring Data JPA、Spring Data Mongo等)创建的所有repository自动创建REST API。

  *如果携带HATEOAS依赖,我想API中应该还会携带超媒体信息*

  1.调整Spring Data REST生成API的基础路径

spring:
  data:
    rest:
      base-path: /api

  2,调整资源路径和关系名称

    当为Spring Data repository创建API时,Spring Data REST会尝试使用相关实体类的复数形式,这会导致某些实体类类名称的复数形式计算错误,导致暴露到了错误的地址上。

    通过Spring Data REST暴露的主资源地址【ip:port/api】,我们可以查看包含了所有接口的链接。

    通过为实体类添加@RestResource注解,我们就可以调整关系名和路径。@RestResource注解能够为实体提供任何我们想要的关系名和路径。

import lombok.Data;
import org.springframework.data.rest.core.annotation.RestResource;
import javax.persistence.Entity;

@Data
@Entity
@RestResource(rel = "tacos", path = "tacos")
public class Taco {
    ...
}

  3,分页和排序

    生成接口的所有主资源链接都提供了可选的page、size和sort参数。默认情况下,请求集合资源都会返回第一页的20个条目。我们可以通过在请求中指定page和size参数调整具体的页数和每页的数量。【page参数从0开始计算】

curl "localhost:8080/api/tacos?sort=createdAt,desc&page=0&size=12"

  4,自定义API接口

    Spring Data REST能够很好的根据Spring Data repository生成CRUD API接口,但一些复杂的业务逻辑则需要我们亲自来定义接口处理。我们将会遇到两个问题。

      1.由于我们调整了Spring Data REST生成API的基础路径,所以想要匹配,我们需要在Controller中进行硬编码,一旦Spring Data REST的基础路径变更,则需要修改响应的Controller硬编码。

        通过为Controller添加@RepositoryRestController注解,这样控制器所映射的基础路径就会和Spring Data REST配置的基础路径相同。

@RepositoryRestController
public class TacosController {
}

        *尽管@RepositoryRestController的名称和@RestController非常相似,但是它并没有和@RestController相同的语义【它并不能保证处理器方法返回的值会自动写入到响应体中】,所以,我们要么需要为方法添加@ResponseBody注解,要么返回包装响应数据的ResponseEntity*

       2,我们的控制器并不会像Spring Data REST那样,生成的API中携带超链接信息。【参考 为Spring Boot 启用超媒体支持 】

  5,为Spring Data REST生成的API接口添加我们自定义的API接口链接信息

    通过声明资源处理器(resource processor)bean,我们可以为Spring Data REST自动包含的链接列表继续添加链接。

    Spring Data HATEOAS提供了一个RepresentationModelProcessor接口,能够在资源通过API返回之前对其进行操作。

    @Bean
    public RepresentationModelProcessor<PagedModel<EntityModel<User>>> userProcessor(EntityLinks links){
        return new RepresentationModelProcessor<PagedModel<EntityModel<User>>>() {
            @Override
            public PagedModel<EntityModel<User>> process(PagedModel<EntityModel<User>> model) {
                model.add(links.linkFor(User.class).slash("recent").withRel("recents"));
                return model;
            }
        };
    }

    上面代码中的RepresentationModelProcessor定义了一个匿名内部类,并将其声明为Spring应用上下文中所创建的bean。Spring HATEOAS会自动发现这个bean(以及其他RepresentationModelProcessor类型的bean)并将其应用到对应的资源上。

    上面的代码中,如果控制器返回了PagedModel<EntityModel<User>>类型,则会包含一个最近创建的User链接。

    

posted @ 2020-12-02 10:57  SpringCore  阅读(816)  评论(0编辑  收藏  举报