网站首页 > 精选文章 / 正文
在本文中,我们将介绍一个便捷的库——Spring Data REST,以消除在Spring Boot应用程序中的无意义代码。众所周知,在Spring Boot应用程序的编码规范中,DB访问API通常被实现为一个
Controller-Service-Repository堆栈。通常情况下,控制器和服务中没有业务逻辑,只是调用下一个组件并返回结果,这正是无意义的代码。Spring Data REST可以帮助我们优雅地消除这些代码。
集成Spring-Data-Rest
将 Spring-Data-Rest 集成到 Spring Boot 应用程序中是一件非常容易的事情,因为官方的
spring-boot-starter-data-rest 已经存在。
所以我们只需将以下依赖项添加到build.gradle(maven为pom文件)即可:
dependencies {
...
implementation 'org.springframework.boot:spring-boot-starter-data-rest'
...
}
然后提供一个实体类和相应的 JPA 存储库接口,如下所示 OrderRecord.java:
@Entity
@Table(name = "ORDER_RECORD")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class OrderRecord {
@Id
private String orderId;
private OrderStatus status;
private Instant createdDate;
private Instant updatedDate;
}
OrderRepository.java:
public interface OrderRepository extends JpaRepository<OrderRecord, String> {
}
启动应用程序并看到奇迹发生:
测试一下接口:
- Profile API
- POST API:
自定义端点
Spring Data REST 的默认设置会在与实体名称相同的路径上暴露所有端点(POST、GET、PUT、DELETE等),例如:POST
http://localhost:8083/orderRecords。有时候,我们可能希望隐藏某些操作、暴露一些特定的搜索API、更改API的路径。 接下来,我们将介绍如何进行上述自定义操作,官方文档中还有许多其他配置选项可供参考,请自行查阅。
隐藏某些操作
在某些情况下,例如在CQRS系统中的纯查询端服务器,只需要暴露GET API并隐藏其他操作API。有两种方法可以实现这一目的:
- 使用DEFAULT策略(无需设置属性),并将@RepositoryRestResource(exported = false) / @RestResource(exported = false)添加到不需要暴露的存储库或方法上。
- 使用ANNOTATED策略,将@RepositoryRestResource添加到要暴露的实体上,还可以在存储库中的方法上添加@RestResource(exported = false),以禁止它们被暴露。
其中,ALL和VISIBILITY是另外两种策略,但我认为它们并不十分有用,所以在这里跳过介绍。
以下示例中,我们希望禁用API的创建、更新和删除操作,因此只需向存储库添加注解,并重写基本方法即可。
public interface OrderRepository extends JpaRepository<OrderRecord, String> {
@Override
@RestResource(exported = false)
void deleteById(String id);
@Override
@RestResource(exported = false)
OrderRecord save(OrderRecord orderRecord);
}
这样,我们就可以禁用不需要暴露的API端点,如下图:
特定的搜索API
有时候,我们需要通过其他字段而不是主键(PK)访问数据的一些API。这时,我们需要实现一些类似搜索API的方法。在Spring Data REST中,也可以很方便地实现这样的功能。我们可以在存储库类中编写一个方法:
public interface OrderEventRepository extends JpaRepository<OrderEventRecord, Long> {
...
List<OrderEventRecord> findByOrderId(String orderId);
...
}
对应的API将会生成(一个GET API,方法参数会变成请求中的查询参数):
更改API的路径
首先,我们可以更改Spring Data REST暴露的所有API的基本路径。最简单的方法是在属性文件(.yaml或.properties)中进行设置,如下所示:
# application.yaml
spring:
data:
rest:
basePath: /api
# application.properties
spring.data.rest.basePath=/api
第二种配置是将路径从实体类名称更改为我们自定义的路径。该库提供了一个@RepositoryRestResource注解,可以用来覆盖存储库中所有API的路径,如下所示:
@RepositoryRestResource(path = "v1-orders", collectionResourceRel = "v1-orders", itemResourceRel = "v1-orders")
public interface OrderRepository extends JpaRepository<OrderRecord, String> {
...
}
默认情况下,搜索方法将会被暴露,并且API的路径与方法名相同。我们可以通过在@RestResource注解中设置属性来进行更改,示例如下:
@RepositoryRestResource(path = "v1-orders-log", collectionResourceRel = "v1-orders-log", itemResourceRel = "v1-orders-log")
public interface OrderEventRepository extends JpaRepository<OrderEventRecord, Long> {
...
@RestResource(path = "order-id")
List<OrderEventRecord> findByOrderId(String orderId);
...
}
总结
所以一般的小项目用 Spring-Data-Rest 能精简很多 Controller 和 Service 代码,大大提高开发效率。
所以我也非常推崇小项目使用 JPA ,而不是 MybatisPlus。
Tags:yaml转properties
猜你喜欢
- 2025-05-23 K8s服务编排
- 2025-05-23 Spring Cloud实战 | 第三篇:Spring Cloud整合Nacos实现配置中心
- 2025-05-23 Java中自定义配置文件可以如此简单
- 2025-05-23 Java教程:学会写Starter-你就懂了SpringBoot自动配置
- 2025-05-23 springboot集成nacos配置中心
- 2025-05-23 说一个大家都知道的 Spring Boot 小细节!
- 2025-05-23 Nacos 统一配置中心动态刷新机制真香
- 2025-05-23 Nacos:简单易用的配置管理和服务发现注册中心
- 2025-05-23 零基础学习Spring Boot的难度有多大?
- 2025-05-23 用配置作为代码设置 Jenkins 实例(使用 Yaml 配置)