当前位置: 首页 > 面试题库 >

我是否应该考虑将DTO用于Spring Rest Controller层而不是实体?

胡泓
2023-03-14
问题内容

我作为一个初学者已经开始了一个Spring Rest项目。我的大多数实体都具有15-20个以上的属性,并且UI层上并非所有属性都是必需的。

我出于以下原因考虑使用DTO:

  1. 为了最大程度地减少出于信息隐私原因要发送的不必要信息。
  2. 减少json字符串的大小以提高性能。
  3. 使用同一实体的不同UI可能具有不同的业务验证(即,必填/可选字段)。我可以为同一实体创建2个DTO,并相应地注释验证。

我正在考虑使用DTO将多个实体合并在一起,根据角色隐藏/显示某些UI的某些信息,但是当我需要保留细节时,我必须将DTO信息“拆分/复制”回不同的实体。

员工-可以查看下一级经理的绩效评估和评论。经理-可以输入绩效评估的注释,并指明员工的加薪幅度(这在员工的用户界面中未显示),但无法查看员工的当前薪资。HR-
能够查看所有UI的所有详细信息。

我想找出是否有更好的方法来解决此类问题,或者我正在为我的项目指明正确的方向?

参考:http : //www.baeldung.com/entity-to-and-from-dto-for-a-java-spring-
application


问题答案:

我总是使用DTO将我的视图与JPA实体分离。除了列出的3个原因外,我还可以添加以下内容。

  • JPA通常在父子之间有双向引用,其中一个是真实的(存在于数据库中),另一个是合成的。序列化为JSON时,您只有父子关系,这是综合关系。
  • 如果直接反序列化到实体,则必须完全了解分离的实体并进行合并。如果您曾经尝试合并大型循环实体图,那么您会知道这不是在公园散步。
  • 对于JSON视图,性能也很重要。如果将实体用于JSON生成,则必须加载所有列。使用投影并直接在DTO中选择所需的列通常会更有效。
  • 如果您有API,则可以将DTO放入一个单独的模块中,以供其他人作为依赖项重用,而您永远不想使用实体类来这样做。
  • JB Nizet 提到了不变性,这也是一个好主意。使用@JSONCreatorDTO可以拥有不可变的DTO,它具有一些优点-尽管大多数情况下DTO不在多线程上下文中使用,因此不需要。

在我的项目中,我总是使用Lombok生成访问方法,这意味着DTO通常仅包含数据字段(有时输入的DTO具有验证器或实用程序方法)。这使得它们超级易于创建/修改,并且易于与包含逻辑的类区分开。与编写业务逻辑相比,创建DTO无需花费时间,因此进行这种解耦的成本非常低,而且老实说,我相信这样做会使读取代码更容易。



 类似资料:
  • 问题内容: 我想避免序列化(在JMS / AMF中),但仍使用JPA / Hibernate保留该字段。 是修改我的朋友?注释和修饰符是否相关? Java规范明确指出,系统服务不会将瞬态字段保存到持久性存储中。但是hibernate是系统服务吗?(我不这样认为) http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.h

  • 我在这里试图得到两个非常相似的问题的答案: 我是否应该在存储库对象中将实体转换为DTO,并将其返回到服务层? 其中是一个注释类-这似乎是我不应该做的第一件事,因为服务层现在知道了一个非常低级别的对象,它违反了在每一层抽象数据的尝试。 如果我将每个转换为,情况就不是这样了--但是我应该这样做吗? 基本改变: 但这对我来说不是最好的解决办法…我在这里能做什么? 要提到的一件重要事情是,它来自GWT项目

  • 问题内容: 我试图在这里得到两个非常相似的问题的答案: 我应该将实体转换为Repository对象内的DTO并将其返回到服务层吗? 要么 从存储库层返回DTO对象可以吗? 现在,我被困在Servlet(服务层)中,例如,尝试从中检索所有对象: 带注释的类在哪里- 这似乎是我不应该做的第一件事,因为服务层现在知道一个非常低级的对象,恕我直言违反了在每一层抽象我的数据的尝试。 如果我将每个实例都转换为

  • 我在Git中有两个主要分支:和。 我的分支的结构如下: 在我执行合并之前,和在提交、和的master中有一个共同的父级 ,我删除了一些文件(比如和)当它们仍然存在于分支中的提交中时,它们不正确。 因此,当我通过创建提交来执行三方合并以加入和时,不再包含foo和bar!Git没有以任何方式通知我他们失踪的消息。 在我看来,因为,和只是在提交之后重新播放,因此和都消失了。 Git合并的这种行为对我来说

  • 问题内容: 我已经了解了Java 和接口之间的区别。从Java 1.5开始,已将其他功能添加到接口,并已调用这些功能以保持向后兼容性。 我的问题是,现在我们有了接口,我们应该一直使用吗?不使用和使用的用例是什么? 问题答案: 两者都有其用途,并且都由java.util.concurrent中的Executor框架支持。Runnable已经存在了更长的时间,但是它仍然在使用并且不被阻止。 可调用程序

  • 问题内容: 从SavedModel Docs中 , SavedModel,TensorFlow模型的通用序列化格式。 和 SavedModel包装了一个TensorFlow Saver。Saver主要用于生成变量检查点。 据我了解,如果有人想使用TensorFlow Serving ,那是必须的。不过,我可以部署Tensorflow模型没有服务服务器:冻结图并将其导出为,和负载图形到会话中使用和创