Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.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 在典型的MVC应用程序中,哪个层负责模型->;DTO转换?_Java_Spring Mvc_Dto - Fatal编程技术网

Java 在典型的MVC应用程序中,哪个层负责模型->;DTO转换?

Java 在典型的MVC应用程序中,哪个层负责模型->;DTO转换?,java,spring-mvc,dto,Java,Spring Mvc,Dto,在标准的SpringMVC应用程序中,我有一个表示层、控制器层、服务层、存储库/持久性层,在发送到表示之前,哪个层应该负责将从DB检索到的数据转换为DTO 一方面,我认为它应该在控制器层,因为它特定于表示所需的数据,本身不是“业务逻辑”,然而,另一方面,我有一种烦人的感觉,即输入智能(即:知道在DTO中填充哪些字段)在控制器中,控制器实际上不是控制器的工作,应该降级到服务层 我意识到这可能是一个“灰色”区域,但有推荐的做法吗?老实说,我不知道有推荐的做法,但我可以告诉你,到目前为止,我所从事的项

在标准的SpringMVC应用程序中,我有一个表示层、控制器层、服务层、存储库/持久性层,在发送到表示之前,哪个层应该负责将从DB检索到的数据转换为DTO

一方面,我认为它应该在控制器层,因为它特定于表示所需的数据,本身不是“业务逻辑”,然而,另一方面,我有一种烦人的感觉,即输入智能(即:知道在DTO中填充哪些字段)在控制器中,控制器实际上不是控制器的工作,应该降级到服务层


我意识到这可能是一个“灰色”区域,但有推荐的做法吗?

老实说,我不知道有推荐的做法,但我可以告诉你,到目前为止,我所从事的项目是如何做到这一点的

从数据库中检索的数据(比如实体)被映射到EntityMapper类中相应的Java类上,该类当然依赖于存储库层,因为它是一个DAO操作

应用于它的任何业务逻辑都应该在服务层中处理,并将其传递给控制器


控制器必须返回数据,但是如果您不想检索实体中的所有DB数据(例如ID、不必要的列等),您可以将它们转换为服务器客户端DTO,这意味着您可以拥有类似的EntityPresentation(愚蠢的名称,我知道)类,但字段较少,这将由控制器传达给表示层。

这应该是DAO的责任,您的存储库/持久化层。基于此,这个任务是为模特而做的。真的吗?在回购层?这意味着DAO/Repo层需要了解表示层所需的数据,这听起来不对。DAO层需要从数据源(在本例中为数据库)读取数据,并将这些数据转换为应用程序中其他层已知的结构,即DTO。然后,DTO从DAO层传递到您的服务/业务逻辑层,您将在其中应用规则(如果有的话),然后将其传递到控制器,最后传递到视图。我也是这样想的。没有什么能阻止我使用我的实体对象作为双重职责;只需在非持久化实体副本中复制必要的字段。我怀疑这应该在控制器层完成,但不确定它是否真正属于那里。好吧,它显然与存储库无关,我认为它应该放在控制器层还是服务层还存在争议。我支持Controller,因为它更多地与您对表示层的“响应”相关,而不是与业务相关。@EricB。执行此复制的任务既不是在控制器中也不是在服务中处理的,而是在实用程序类中处理的,而是服务层的任务,用于处理此数据复制的原因,可能是由于某些业务逻辑规则。@LuiggiMendoza同意它属于util类,但我仍然不相信它应该由服务层而不是控制器来授权。毕竟,控制器的角色知道表示需要哪部分数据。你能提供具体的例子说明为什么它应该是代理的服务层吗?@EricB。控制器将只将从服务准备的数据传递到表示层,因为服务知道哪些规则应用于必要的数据。我想请您展示一个场景,显示控制器修改数据而不是服务。