当前位置: 首页 > 知识库问答 >
问题:

在Spring Boot项目中,将实体到DTO转换放在哪里?

锺离刚洁
2023-03-14

我正在开发Spring Boot(MVC、DATA、JPA…)角度项目。

我在两种选择之间左右为难。尽管如此,它们都能正常工作。

从架构的角度来看,哪一个是最好的,哪一个使用最多。

我的问题是,从实体到DTO的最佳转换方式是什么。

选项1:我现在正在实施的那个。

我将转换放在控制器中。在我的控制器中,我调用一个服务方法来获取实体列表。然后,我使用ModelMapper将实体列表转换为DTO列表,并将结果返回到前端。

Entity ==> Repository ==> Service ==> Controller ==> ModelMapper ==> Return DTO

>

缺点:控制器中有很多代码(以防我需要解析列表...)

备选案文2:

将转换放在服务层中。

因此,我的服务层将返回DTO列表,而不是返回实体列表。

Entity ==> Repository ==> Service ==> ModelMapper ==> Controller  ==> Return DTO

>

  • 优点:服务返回的对象将直接返回到前面(控制器中的代码不多)

    缺点:我不知道

  • 共有3个答案

    金慈
    2023-03-14

    遵循干净的编码原则,服务层应该进行转换,但由于它只是转换,不涉及业务逻辑,所以您的控制器也可以这样做。然而,如果转换代码不超过3-4行代码,我只会在控制器中这样做。因为这会让我的控制器看起来乱七八糟。参考-https://www.baeldung.com/entity-to-and-from-dto-for-a-java-spring-application.

    羊光辉
    2023-03-14

    最好的方法,基于你的项目结构。但是,如果您总是将服务调用到控制器,您应该使用选项2,然后它将返回所需的结果。

    此外,如果您想减少方法中转换的大量代码,可以通过使用@Component映射实体和DTO来创建一个转换器类。

    凤自珍
    2023-03-14

    我相信将实体转换为DTO的更好方法是:

    >

  • 如果在服务中不需要实体,则仅在存储库级别将实体转换为
    DTO。此外,如果您使用的是Spring Data JPA,那么您可以直接将实体转换为DTO,而无需任何额外的代码。但是如果您正在编写复杂的查询,而它无法完成,那么您可以在回购实现中转换它。
    这样做将确保任何服务都不会获得它必须没有的数据。不会暴露任何敏感数据。

    如果你真的需要实体,并且没有工作围绕它,那么你可以在服务层将它转换为DTO,因为控制器绝不能有它不应该有的数据访问。任何敏感数据都不应该暴露在控制器级别。这不是一个好设计。

    我认为这些是你可以进行实体到DTO转换的方法,但是最好的设计是在回购本身中将实体转换为DTO。

    我希望这能帮助你解决你的问题。

    祝你好运

  •  类似资料:
    • 我找了无数的问题。但大多数问题如下。 实体- 但我不想这样。 若Dto中不存在实体中的属性值,我想知道如何将Dto转换为实体。 没有为[annotations,Lombok,jpa,…]指定代码,但是它存在! userService的所有方法都返回DTO。如何在Post实体中设置用户实体?我收到一个userDto返回,它只有用户名。 这种时候我该怎么办? 存储库不是直接从控制器调用的。 服务将无条

    • 我有一个项目,我需要在数据库中存储用户。我正在使用Hibernate,在模块的某些部分中,也在实验性地使用Spring数据JPA。我有一个用于注册客户的RESTendpoint,并在那里接收UserDTO对象。之后,在其他服务中,我需要将其转换为UserEntity并保存在数据库中。 现在我创建了用户设置页面,我需要显示一些关于登录用户的信息。我不想发送UserDTO对象,因为有太多的数据,所以我

    • 我正在尝试将复杂的实体转换为Dto。我想从DTO中删除实体中的一些值。 我的实体看起来像这样(为了简单起见,省略了实体的大部分): 我找到了一个对简单实体非常有效的解决方案:将实体转换为数据。如果我采纳了自定义拦截器的建议,删除id或整个item属性就可以了。 我尝试了两种方法来定义我的DTO: < li >它仅返回id和整个项目。 现在的问题是我只想删除 item 属性中的某些值。例如,私有字段

    • a)如果我把persistence.xhtml放在src/main/java/META-INF/Gradle不会将其包含在生成的jar文件中,因为它不是java文件。 b)如果我把它放在src/main/Resources/META-INF/Gradle会将它包含在生成的jar文件中但是Eclipse会抱怨"Nopersistence.xmlfile find in project"即使我在源代码

    • 问题内容: 我们将使用DTO在表示层之间来回发送数据。我们有像这样的图层: facade appService domain 并且我们使用推土机来帮助我们将实体转换为dto。但是我现在有两个问题: 从实体到dto,我们可以使用推土机,但是从dto到实体,我们可以使用推土机吗?如果是,如何? 我应该在哪里创建实体?在外观或DTOAssembler中? 例如,我必须注册一本书。这本书的实体外观如下:

    • MVC中DTO转换应该在哪里进行? 我正在使用JPA。从控制器接收DTO作为参数。 此时,是否需要在控制器中转换它并将其传递给服务? 或者,我想知道服务是否接收DTO并转换它。