Spring (26)Spring Data REST

164 阅读3分钟

Spring Data REST 是一个构建在 Spring Data 之上的框架,它可以根据你的 Spring Data repositories 自动创建 RESTful API。这意味着你可以使用 Spring Data JPA、MongoDB、Cassandra、Redis等来定义数据访问层,并且Spring Data REST 会自动为你的实体提供 HTTP 访问路径。

核心概念

  • Repository: Spring Data repository 是一种访问数据存储的机制。Spring Data REST 会为这些 repository 中定义的方法自动创建相对应的 REST 端点。
  • Resource: 在 Spring Data REST 中,资源表示暴露给客户端的任何东西,通常是你的领域模型(如实体或聚合根)。
  • Representation: 表现层是资源的数据表现形式,通常是 JSON 或 HAL+JSON。

如何工作

当你定义一个 Spring Data repository 后,Spring Data REST 会使用 HAL(Hypertext Application Language)格式来序列化你的实体到 JSON,并为你的实体自动创建CRUD(创建、读取、更新、删除)端点。HAL是一种轻量级的媒体类型,可以提供有关资源的链接信息。

使用Spring Data REST的步骤

  1. 添加依赖:在你的构建配置中添加Spring Data REST依赖。

    <!-- Maven dependency for Spring Data REST -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-rest</artifactId>
    </dependency>
    
  2. 定义实体:创建你的JPA实体。

    @Entity
    public class Person {
        @Id @GeneratedValue
        private Long id;
        private String firstName;
        private String lastName;
        // getters and setters
    }
    
  3. 创建Repository:定义一个repository接口,继承Spring Data提供的repository接口之一。

    public interface PersonRepository extends PagingAndSortingRepository<Person, Long> {
        List<Person> findByLastName(@Param("name") String name);
    }
    
  4. 启动Spring应用程序:使用@SpringBootApplication注解来标注主类。

    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    
  5. 访问你的REST API:运行你的应用程序,并访问 /people 查看所有人员或 /people/{id} 访问特定人员的信息。

Spring Data REST的工作原理

在底层,Spring Data REST 使用了一个名为RepositoryRestMvcConfiguration的Spring MVC配置类,它会自动配置和启动Spring MVC和Spring Data REST功能。这个配置类会注册必要的HTTP消息转换器、链接工厂和资源处理器。

自定义

虽然 Spring Data REST 的目标是提供一个即插即用的REST API,但它仍然提供了定制的能力。

  • 通过使用@RepositoryRestResource注解,你可以自定义暴露的路径、暴露的方法等。
  • 你可以通过注册实现了ResourceProcessor接口的Spring Bean来自定义资源的表示。
  • 使用@RestResource注解可以自定义单个查询方法的导出。

代码演示

假设你有一个实体Book和一个简单的BookRepository

@Entity
public class Book {
    @Id @GeneratedValue
    private Long id;
    private String title;
    private String author;
    // Getters and Setters
}

@RepositoryRestResource(collectionResourceRel = "books", path = "books")
public interface BookRepository extends PagingAndSortingRepository<Book, Long> {
    List<Book> findByAuthor(@Param("author") String author);
}

一旦你启动了应用程序,Spring Data REST 会自动为这些实体和查询方法创建REST端点,如/books/books/{id}/books/search/findByAuthor?author=...

总结

Spring Data REST 是一个强大的工具,可以节省时间,并减少创建基本CRUD REST API的冗余代码。它通过简单的配置和约定优于配置的原则,使得创建和维护RESTful服务变得轻而易举。通过自定义和扩展机制,它也允许开发者在需要时进行灵活的调整。