【问题标题】:Spring Data REST: use service instead of CrudRepository?Spring Data REST:使用服务而不是 CrudRepository?
【发布时间】:2020-07-08 20:27:29
【问题描述】:

我只是在探索 Spring Data REST 库以构建 REST API。

但在许多示例中,我看到一个 REST API 是从 CrudRepository 生成的。

我想知道这在生产中是否真的有用?在我看来,快速启动和运行某些东西很容易,但我宁愿将 REST API 耦合到“真正的”服务,而不是“只是”一个存储库。

您对此有何看法?

亲切的问候, B.

【问题讨论】:

    标签: spring-boot rest repository spring-data-rest


    【解决方案1】:

    Repository 层旨在持久化或从数据库中检索您的域对象。

    服务层应该包含一些在域对象上执行的业务逻辑。

    如果您只需要从数据库中获取域对象——您的应用程序中并不需要任何服务。这就是为什么从 CrudRepository 生成许多示例的原因 - 这个接口提供了将数据传输到/从数据库传输的基本功能。

    但如果除了简单的数据传输之外,您还需要对对象执行一些额外的逻辑 - 您需要单独的服务。

    【讨论】:

      【解决方案2】:

      您可以添加使用您的服务的自定义控制器。

      例如,域BookingBookingRepository

      请注意,如果您将@RequestMapping(path = "bookings") 放在控制器上,Spring Data REST 提供的所有端点都将被覆盖且无法访问。所以把你@RequestMapping和它的变化,比如@PutMapping放在方法上。

      如果一个控制器方法有@PostMapping("bookings"),那么Spring Data REST提供的POST端点将被这个自定义控制器方法替换。

      @RepositoryRestController
      public class BookingController {
      
          private final BookingService bookingService;
      
          @PostMapping("/bookings")
          public ResponseEntity create(@RequestBody Booking booking) {
              ...
          }
      }
      

      如果控制器方法具有不同的请求映射路径,则保留 Spring Data REST 提供的所有端点。

      @RepositoryRestController
      public class BookingController {
      
          private final BookingService bookingService;
      
          @PutMapping("/bookings/{id}/confirm")
          public ResponseEntity confirm(@PathVariable String id) {
              ...
          }
      }
      

      你可以在Github找到我的BookingController的完整代码

      【讨论】:

        猜你喜欢
        • 2015-12-25
        • 2015-06-19
        • 1970-01-01
        • 1970-01-01
        • 2018-01-17
        • 1970-01-01
        • 1970-01-01
        • 2016-08-16
        • 2018-02-04
        相关资源
        最近更新 更多