java - 在 spring boot 中混合实体和 payload (dto) - 最佳实践

标签 java spring-mvc spring-boot

让一个类同时作为实体(映射并存储在数据库中)和有效负载(对象序列化并从 REST 端点返回)是否是一种好的做法?

我在某处听说实体永远不应该高于服务层,而应该映射到服务中的 DTO 对象,然后这些 DTO 应该返回给 Controller 。

我个人认为这是不好的做法,因为在这样的类中,我们混合了用于序列化为 JSON 和用于将对象映射到数据库的注释,这使得代码难以阅读。

但也许还有一些其他的争论。你怎么看?

最佳答案

我个人认为将图层分开是一种很好的做法。 我会用以下内容来激励。

假设您有一个客户,客户 A。

客户端 A 通过 Restful 端点集成到您的系统中并需要帐户信息。您对 Rest 端点进行版本控制并返回版本控制的 Account 实体。

@Entity
public class Account {
   private Long id;
   private String firstname;
   private String lastname;

   //Getters and setters are omitted for the sake of brevity
}

客户 A 对信息很满意并使用了 6 个月。

6 个月后,您的数据库团队开始清理/重构过程,并将姓氏更改为姓氏,将名字更改为姓名。 以下需要更改,因为所有这些都可能接触到对象:

  1. 数据库层
  2. 持久层
  3. 业务层
  4. 表现层

如您所见,微小的变化会引发大量变化。 它还破坏了版本化 Restful 端点的契约。

如果实体在业务层中转换为 DTO,则更改将包含在您的应用程序边界内并且影响最小。契约(Contract)也保持不变,客户端无需更改。

关于java - 在 spring boot 中混合实体和 payload (dto) - 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53651300/

相关文章:

java - JUnit 如何在Optional 和对象上断言True/Equals

java - 如何通过 post 请求将数据保存在 Cosmos DB 中?

java - 如何在java中使用CommandLineJobRunner构建多个集成测试用例

java - 如何让错误显示出来

java - Maven 编译多个 src 目录

java - Service Now 日内瓦 Rest API Java 代码 将文件附加到事件

spring - Thymeleaf 中的条件包装

java - 有什么方法可以处理 "flush"字符串吗?

java - 使用 JAXB 和 Spring-MVC 进行 XML 绑定(bind)

java - spring boot 启动器 graphql 不工作