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

Spring Entries应该在服务中转换为Dto吗?

郜谦
2023-03-14
问题内容

实体在返回控制器之前应该转换为Dto吗?


问题答案:

有一千种方法来做某事,并且对什么是最好的方法也有很多看法。但是没有最好的方法,一切都有优点和缺点。请记住这一点!

通常,你具有不同的层:

  • 持久层存储数据
  • 业务层来处理数据
  • 表示层公开数据

通常,每个层都将使用其自己的对象类型:

  • 持久层:存储库,实体
  • 业务层:服务,域对象
  • 表示层:控制器,DTO

这意味着每一层只能使用其自己的对象,而永远不会将它们传递给另一层。

为什么?因为你希望每个层都与其他层分开。如果要在控制器中使用实体,则演示将取决于数据的存储方式。真的很糟糕 你的视图与数据的存储方式无关。它甚至不知道该如何存储数据。

考虑一下:更改数据库模型,例如,向一个数据库表中添加一个新列。如果将实体传递给控制器​​(或更糟糕的是:控制器将其公开为JSON),则数据库中的更改将导致演示文稿发生更改。如果将实体直接公开为JSON,这甚至可能导致JavaScript或其他使用JSON的客户端发生更改。因此,对数据库进行简单的更改可能需要更改JavaScript前端,因为你将各层紧密耦合在一起。你绝对不希望在实际项目中那样。

怎么样?你怀疑这是否可行,因此仅是一个简单的示例(使用伪代码):

class Repository {
    public Person loadById(Long id) {
        PersonEntity entity = loadEntityById(id);
        Person person = new Person();
        person.setId(entity.getId());
        person.setName(entity.getFirstName + " " + entity.getLastName());
        return person;
    }
}

在此示例中,你的存储库将在内部使用实体。没有其他层知道或使用此实体!它们是此特定层的实现细节。因此,如果要求存储库返回“人员”,则该存储库将在实体上工作,但它将返回域对象。因此,在需要更改实体的情况下,可以保存与存储库一起使用的域层。如你所见,在名称的情况下,域和数据库可能会有所不同。虽然数据库以名字和姓氏存储名称,但是域仅知道一个名称。这是持久性如何存储名称的详细信息。

控制器和DTO(仅另一层)也是如此。



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

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

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

  • 我有一个SpringREST接口,控制器正在进行从DTO到业务实体对象的转换。服务层对业务实体对象进行操作。然而,如果我的业务层想要调用外部REST接口,那么该业务实体到DTO的转换应该在哪里发生?在业务层?使用RestTemplate进行调用的DAO对象?另一层?当前调用顺序如下所示: 谢谢!:)

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

  • 我使用的是Spring数据JPA。 我的控制器如下所示 现在我决定发送一个PageDTO对象来代替Page对象,以限制发送内容。有什么办法可以用java 8把页面转换成页面? 我看到Page是从派生而来的,所以我想我可以做一些类似的事情,但不知道如何将它与PageDTO和UserDTO结合起来。 有没有有效的java 8方法来做到这一点。 我想出了这个解决方案 我想知道是否有另一种有效的方法来做到