java—在SpringBoot项目中将实体放到dto转换的何处?

aiazj4mn  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(605)

我正在做一个springboot(mvc,data,jpa…)项目。
我在两种选择之间左右为难。虽然,他们都工作没有任何问题。
从建筑学的Angular 看,哪一个最好,哪一个用得最多。
我的问题是,从实体到dto的最佳转换方式是什么。
选项1:我现在正在实施的方案。
我把变换放在控制器里。在我的控制器中,我调用一个服务方法来获取实体列表。然后,我使用modelmapper将实体列表转换为DTO列表,并将结果返回到前端。

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

优点:服务层总是返回实体对象(重用)
缺点:控制器中有很多代码(以防我需要解析列表…)
方案2:
将转换放在服务层中。
因此,我的服务层将返回DTO列表,而不是返回实体列表。

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

优点:服务返回的对象将直接返回到前端(控制器中的代码不多)
缺点:我不知道

wvyml7n5

wvyml7n51#

最好的方法,基于你的项目结构。但是,如果总是将服务调用到控制器中,则应该使用选项2,然后它将返回所需的结果。
此外,如果您想减少方法中转换的大量代码,可以使用@component来Map实体和dto,从而创建一个converter类。

alen0pnh

alen0pnh2#

我认为将实体转换为dto的更好方法是:
如果您真的不需要服务中的实体,那么将实体转换为
仅存储库级别上的dto。如果你使用的是spring数据jpa,
然后您可以直接将实体转换为dto,而无需任何额外的代码。
但是,如果您编写的复杂查询不能由它来完成,那么您可以在repo实现中转换它。
这样做将确保任何服务都无法获得数据
它一定没有。不会暴露任何敏感数据。
如果你真的需要实体,而且没有解决的办法,那么
您可以将其转换为服务层中的dto,因为控制器不能
具有不应具有的数据访问权限。任何敏感数据都不应该
暴露在控制器级别。这不是一个好的设计。
我认为这些方法可以实现实体到dto的转换,但最好的设计是在repo中将实体转换为dto。
我希望这能帮助你解决问题。
祝你好运!

qnyhuwrf

qnyhuwrf3#

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

相关问题