java - Spring DTO-DAO(资源-实体)映射到哪个应用层 : Controller or Service?

标签 java spring spring-mvc architecture spring-hateoas

我正在编写一个公开 RESTful 服务的 Spring (4.1.7) Web 应用程序,并希望使用 DTO“资源”对象在 Controller 和客户端浏览器之间进行通信,而不是公开我的持久性实体。

目前应用有以下几层:

  • 查看(JSP/JSON)
  • 控制者
  • DAO(@Service)
  • DAO(@Repository)

我的问题是,我应该在哪里将我的 DAO 实体映射到 DTO 资源?我查看了一些使用 Spring HATEOAS 的示例,它们显示 Resource 扩展 ResourceSupport 的对象被映射到 Controller .这是最好的方法吗,还是我应该从 DAO 服务返回资源?

我希望将 Link 元素添加到返回的资源(用于自身和相关资源),但看不到 Link 元素如果在Service 不知道 Controller 并且它是 @RequestMapping。另一方面,我也不知道将 Controller 与映射混淆是否是一种好习惯。

最佳答案

DTO(数据传输对象)顾名思义,用于将数据传输出您的应用程序。在您的情况下,放置它们的最佳位置是在您的 Controller 层中。 您应该只将 DTO 公开给 UI,当您从 UI 获取数据时,您应该将其转换为业务实体并调用下面的层。 原因是,通过这种方式,您可以在不破坏 UI 的情况下自由更改业务实体,从而实现更好的维护。出于同样的原因,您的业务/DAO 层也应该不知道 UI 和 DTO。 因此,在您的应用中将 DTO 转换为业务实体(反之亦然)的最佳位置是 Controller 层。

PS:看看Dozer也是;)

关于java - Spring DTO-DAO(资源-实体)映射到哪个应用层 : Controller or Service?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31644131/

相关文章:

java - 正确的 Java 继承结构

java - 缺少 Google Play 游戏服务类

java - weblogic 上的 java 自定义缓存重新加载

java - 将 Ajax 与 Spring Portlet 结合使用

jsf - Spring MVC + Facelets,有可能吗?

java - 如果数组中的位置 0 超过最大位置,如何返回该位置?

java - 在 Google Appengine 服务器上使用 Polymer 应用进行路由

java - Aop调用异常 : in @Autowieired in JUnit

java - Spring AOP 建议被执行两次

java - 了解 Spring MVC 配置