【问题标题】: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】:
您可以添加使用您的服务的自定义控制器。
例如,域Booking 和BookingRepository。
请注意,如果您将@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的完整代码