MySQL, Oracle, Linux, 软件架构及大数据技术知识分享平台

网站首页 > 精选文章 / 正文

小项目开发神器,Spring-Data-Rest 让你的代码身轻如燕!

2025-05-23 17:39 huorong 精选文章 5 ℃ 0 评论

在本文中,我们将介绍一个便捷的库——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

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言