【问题标题】:Where to create Entity objects in Spring Rest ? in service, DAO or API layer?Spring Rest 在哪里创建实体对象?在服务、DAO 或 API 层?
【发布时间】:2017-09-11 15:00:25
【问题描述】:
我想知道创建实体对象的最佳层在哪里,例如,我有一个名为 Product 的模型,我已经创建了一个 API post 方法和路径(“/product”)来创建产品,我在想在 API 方法创建 Product 对象,然后将此对象传递给服务层进行验证,然后在验证的情况下将其传递给 DAO 层进行持久化。
但是我不确定这是否是一个好习惯,我也在考虑将产品参数传递给服务层并在服务层而不是 API 层创建它。
我很想听听你的想法和想法。
【问题讨论】:
标签:
spring
architecture
spring-rest
【解决方案1】:
每一层都应该做一些工作:
- API 层 - 验证
- 服务层 - 应用程序的业务逻辑
- DAO 层 - 持久化到 DB
我认为在 API 层使用 DTO 对象会更好。例如,你可以有这样的方法:
class ProductController {
public Response createProduce(@RequestBody @Valid ProductDto productDto) {
// ...
}
}
在此方法的主体中,您可以进行一些额外的验证并调用服务方法:
class ProductService {
public void createProduct(ProductDto productDto) {
// impl
}
}
在服务方法的主体中,您应该创建一个实体对象并将 DTO 映射到新创建的实体。然后你应该调用 DAO 层。
在大多数情况下,服务层必须执行更多操作,而不仅仅是从 DAO 对象调用方法。并且操作应该在同一个事务中执行,所以服务层也应该管理事务(我的意思是@Transactional注解应该出现在服务方法上)。
DAO 对象应该只持久化实体。
【解决方案2】:
根据我的经验,您不会在 API 层中创建实体对象,而是创建数据传输对象 (ProductDTO),包装从 API 调用接收到的所有实体属性。此 DTO 类用于服务层中的任何验证,如果一切顺利,您可以让您的 Product 实体实例仅通过 DAO 持续存在。