Spring Boot,决定分别为REST和JPA创建DTO对象

时间:2016-02-06 07:19:51

标签: spring rest jpa spring-boot

我猜传统上,RESTful Web服务会使用一种DTO对象进行POJO / JSON转换,还有一种单独的DTO对象用于数据库实体/ POJO转换?

Spring Boot应该更加自以为是,更容易使用,但是你仍然会为JSON和数据库实体表示使用不同的DTO对象类型,还是将实体对象直接转换为JSON?

1 个答案:

答案 0 :(得分:13)

让我分享一下我的观点。

起初,我认为你的问题与春季启动无关。 Spring启动只是提供了一种花哨轻巧的方式来启动应用程序,并允许以更简单的方式构建应用程序。 但是你仍然有你的休息控制器,从那时起它对任何其他类型的应用程序都没有太大差别。

所以你真正要问的是,维护JSON对象的抽象并将它们转换为业务逻辑实体对象以及稍后将它们再次转换为数据库对象还是足以维持2个级别和放弃了Json级别。

我认为答案是“它取决于”。

首先,总的来说,目前的趋势是简化。所以也许它足以维持只有1级对象。

这种方法有很多优点:

  • 显然维护的代码较少
  • 开发和测试的速度(应检查POJO,转换器应进行测试等)
  • 执行速度 - 您无需在转换时浪费CPU时间。一种明显的含义。
  • 不太明显:内存消耗。让我们说你使用DAO返回的大量数据。假设它占用10MB的内存(仅仅是为了举例)。现在,如果你开始转换到商业实体,你将花费另外10MB,现在如果它的A JSon对象,那么它再次10MB。关键是所有这些对象可能同时存在于内存中。当然,如果你正确地实施了一切,GC可能会照顾它们,但这是另一回事。

然而,这种简化有一个缺点。

总之,我称之为承诺

应用程序中有三种类型的API。

  • 您在Web服务级别提交的API - JSon结构。 很可能是各种客户端(根本不需要使用JVM)正在针对您的Web服务运行并使用数据。所以他们真的希望你提供给定结构的JSon对象。

  • 您商家的API。如果您的业务逻辑层非常复杂,那么您可能拥有一个开发该逻辑的整个团队。所以你通常在团队之间的API级别工作。

  • DAO的级别 - 实际上与Business Logic的故事相同。

现在,如果您在一个级别更改该API,会发生什么。这是否意味着所有级别都将被打破?

实施例

让我们说,我们不保持“JSon”级别。在这种情况下,如果我们在业务逻辑级别更改API,则JSON也会自动更改。所有其余框架都会很乐意为我们转换对象,并且用户可能会获得另一个数据。

另一个例子

可以说,你的BL层提供了一个如下所示的Person实体:

class Person {
      String firstName;
      String lastName;
      List<Language> languages;
   }

   class Language {
     ...
   }

现在,假设您有一个使用REST服务的UI,该服务根据请求提供人员列表。如果UI中有2个不同的页面怎么办?仅显示人员的人(在这种情况下,提供一个人所说的语言列表是没有意义的)。 但是,在第二页中,您希望获得完整信息。

所以,你最终会暴露2个网络服务或者通过一些参数使现有服务复杂化(你拥有的这些参数越多,它就越不像其他参数:)) 也许分离会有所帮助吗?我不知道。

底线。 我会说,只要你能够在没有这种分离的情况下生活 - 去做吧。它甚至可以用于相当大的项目。当然,它可以用于中小型项目。

如果你发现自己在修复中挣扎,并且你觉得这样的分离可以解决问题 - 那么就进行分离。

希望这有助于理解其含义并选择适合您的方法