【发布时间】:2020-04-12 18:23:02
【问题描述】:
我在 Spring 上做 REST API。参加了 Spring Data Hibernate 的课程,发现它使 REST API 成为最耗时的方式。
当我向域中添加一个新实体时,我经历了以下对象链:
- 实体 - 域对象
- DTO - 用于向/从客户端传输/接收对象
- 映射器 - 在实体和 DTO 之间进行转换
- 存储库 - 用于与数据库交互
- RestController - 用于处理 API 请求
- Service - 对象的服务类
我的大致行动链如下:
- RestController 处理请求 - 从客户端接收 DTO(在创建新对象的情况下)
- 控制器中的映射器将 DTO 转换为实体
- 服务被调用
- 服务访问存储库
- Repository 返回执行结果(由Entity创建)
- 服务返回实体在 RestController 中创建
- RestController 向客户端返回一个 ResponseEntity 类型的对象,我在其中放置了正文和响应代码。
如您所见,一连串的动作和大量的对象。
但后来我发现,如果你使用 Spring Data REST,这一切都不需要 Spring 提供的所有 API。一般情况下,只需要创建一个Entity和Repository即可。
事实证明,对于典型的 CRUD 类型的操作,我徒劳地写了很多控制器及其方法。
问题:
- 什么时候应该使用 RestConroller,什么时候应该使用 Spring Data REST?
- 是否可以为一个实体组合两种方法?事实证明,我是在浪费时间编写简单的操作,例如创建、获取、保存、删除控制器,可以将其移至 Spring Data REST。
- 我能否在 RestConroller 中实现我在 Spring Data Rest 中所做的一些操作?如:
- 将实体属性值作为 id 而不是对象返回?我的意思是我有实体本身的实体的属性,对于这些字段,我有时需要返回它们的 ID 而不是整个实体。
- 有什么方法可以控制错误处理吗?在 RestController 中,我实现了 ResponseEntityExceptionHandler 扩展类,并且在我的 RestController 中出现的所有错误都以相同的方式在一个地方进行处理,并且我始终知道所有错误将返回大致相同的响应结构。
- 数据验证必须取决于它曾经在从客户端收到的 DTO 上进行验证的事实。在这方面有什么细微差别在等着我吗?
我对如何前进有点困惑。给我你的建议和想法。推进使用什么以及如何使用。
【问题讨论】:
标签: spring spring-mvc spring-data-jpa spring-data spring-data-rest