zoukankan      html  css  js  c++  java
  • 使用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链接。

        

  • 相关阅读:
    HTTP的传输编码(Transfer-Encoding:chunked)
    单向链表寻找入环点算法的证明
    Java容器解析系列(17) LruCache详解
    Java容器解析系列(16) android内存优化之SparseArray
    Java容器解析系列(15) HashTable Dictionary & Properties
    Java容器解析系列(14) IdentityHashMap详解
    Swift开发之iOS11下UIToolBar非正常显示问题
    Python爬虫之Scrapy框架爬取XXXFM音频文件
    ARKit文档翻译之ARTrackable协议
    ARKit文档翻译之ARAnchor类
  • 原文地址:https://www.cnblogs.com/fanqisoft/p/14072508.html
Copyright © 2011-2022 走看看