在Spring Rest中创建实体对象的位置?在服务,DAO或API层?

时间:2017-09-11 15:00:26

标签: spring architecture spring-rest

我想知道创建实体对象的最佳图层在哪里,例如我有一个名为Product的模型,我已创建并带有路径的API post方法(" / product")为了创建产品,我想在API方法中创建Product的对象,然后将此对象传递给服务层以验证它,然后在验证的情况下将它传递给DAO层以保持它。

但是,我不确定这是一个好的做法,我也在考虑将Product参数传递给Service层并在服务层而不是API层创建它。

我有兴趣听取您的想法和意见。

2 个答案:

答案 0 :(得分:2)

每一层都应该做一些工作:

  • 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对象应该只保留实体。

答案 1 :(得分:0)

我的经验是,您不在API层中创建实体对象,而是创建数据传输对象(ProductDTO),包装从API调用接收的所有实体属性。此DTO类用于服务层中的任何验证,如果一切顺利,您只能使您的产品实体实例通过DAO持久化。