使用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链接。