Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在控制器、服务和存储库模式中使用DTO_Java_Spring_Spring Boot_Dto - Fatal编程技术网

Java 如何在控制器、服务和存储库模式中使用DTO

Java 如何在控制器、服务和存储库模式中使用DTO,java,spring,spring-boot,dto,Java,Spring,Spring Boot,Dto,我正在遵循控制器、服务和存储库模式,我只是想知道DTO是从哪里来的 控制器是否应仅接收DTO?我的理解是你不想让外界知道底层域模型 从域模型到DTO的转换应该发生在控制器层还是服务层 一个简单的答案可能是:DTO(如果您需要,请参见下文)是允许您将特定信息传输到其他地方的东西。这是控制器/适配器/存储库/无论您如何称呼它的任务。适配器的任务是从外部世界(系统边界之外)获取信息,并将这些信息转换为相应的域模型,以便服务逻辑能够使用它 而且,在我看来,这也适用于存储库:存储库将数据持久化到外部系统(

我正在遵循控制器、服务和存储库模式,我只是想知道DTO是从哪里来的

控制器是否应仅接收DTO?我的理解是你不想让外界知道底层域模型


从域模型到DTO的转换应该发生在控制器层还是服务层

一个简单的答案可能是:DTO(如果您需要,请参见下文)是允许您将特定信息传输到其他地方的东西。这是控制器/适配器/存储库/无论您如何称呼它的任务。适配器的任务是从外部世界(系统边界之外)获取信息,并将这些信息转换为相应的域模型,以便服务逻辑能够使用它

而且,在我看来,这也适用于存储库:存储库将数据持久化到外部系统(例如数据库或其他REST服务),并在请求时将其带回。为此,它可能需要将域模型转换为简化的DTO,以便能够持久化到目标系统中

适配器的思想是,业务逻辑不需要知道如何转换要在REST/SOAP/MySQL/中表示或通过REST/SOAP/MySQL/传输的对象。。。协议这就是适配器的任务。因此:如果需要,DTO应该留在适配器中

你真的需要DTO吗? DTO是系统内部数据的另一种抽象。你还应该考虑一下你是否真的需要它们。您可以这样做,也可以不这样做,这取决于您希望如何处理这些信息。如果您使用自己编写查询的数据库保存数据(意味着您没有使用ORM映射器),则可能根本不需要DTO,因为您可以直接从域模型提取相关信息

另一方面,如果您对对象使用反序列化程序(如Jackson for JSON或类似的东西),您可能会发现自己需要DTO,因为这些工具有时需要一些特殊要求,以便能够将数据序列化和反序列化为对象。在这里,您可能需要先使用DTO,然后才能将其转换为域对象,反之亦然



顺便说一句:这个问题回答得也很好

正确的方法应该是控制器->服务->实现->存储库


存储库层可以返回底层模型,当实现层接收到该模型时,可以将其转换为DTO。

不同的组织遵循不同的模式。这取决于你遵循的模式。根据我个人的经验,我遵循下面的架构图


根据上图,DTO到实体的对话以及DTO到实体的对话将仅在服务层内。

在今天使用Spring MVC和交互式UI编程时,web应用程序实际上有4层:

  • UI层(Web浏览器、JavaScript)

  • MVC控制器,即用
    @Controller

  • 服务层,即用
    @Service

  • 数据访问层,即用
    @Repository

每次这些层中的一个与底层交互时,它们都需要发送/接收数据(通常为POJO),以便在层之间传输数据。这些POJO是DTO,也称为数据传输对象

各层之间仅应使用DTO,且它们不一定相同,例如,服务层可将业务逻辑应用于从数据访问层接收的DTO,因此服务层API的DTO不同于数据访问层API。类似地,控制器可以重新排列数据以准备呈现(分组、摘要等),因此发送到web浏览器的数据不同于从服务层接收的数据

在完全抽象的情况下,数据访问层的API不应反映数据访问的技术,即是否使用JDBC、JPA、NoSQL、web服务或其他存储/检索数据的方法。这意味着实体类不应位于数据访问层之外

大多数项目不需要这种抽象级别,因此DTO通常是一个实体类,从数据访问层一直流到控制器,在控制器中由视图使用,或发送到web浏览器,编码为JSON


这取决于项目的规模和复杂性。项目越大,使每一层尽可能抽象/独立就越重要。

太好了,它来自哪里?