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

Java REST API-是否有DTO?

云宏儒
2023-03-14
问题内容

我目前正在为一个项目创建REST-API,并且一直在阅读有关最佳实践的文章。许多人似乎反对DTO,只是公开域模型,而其他人似乎认为DTO(或用户模型或任何您想称呼的东西)是不好的做法。我个人认为这篇文章很有道理。

但是,我还了解了DTO的所有额外映射代码,域模型可能与其DTO对应对象100%相同的缺点等。

我们主要创建API,以便其他客户端可以使用数据,但是,如果操作正确,我们也将尽可能地将其用于自己的Web GUI。

问题是我们可能不想将所有域数据公开给其他客户端用户。许多数据仅在我们自己的Web应用程序中才有意义。另外,我们可能不希望在所有场景中公开有关某个对象的所有数据,尤其是与其他对象的关系等等。例如,如果我们公开特定对象的列表,则不一定要公开整个对象层次结构。这样就不会暴露对象的子对象,而是可以通过链接(阴影)来发现它。

我应该如何解决这个问题?我正在考虑在我们的域模型上使用Jackson混合来控制在不同情况下将公开哪些数据。还是考虑到DTO的缺点和争议,我们是否应该一路使用DTO?


问题答案:

为什么要在REST API中使用DTO
DTO代表d ATA 牛逼转让(BOT)Ø bject。

创建此模式的目的非常明确:将数据传输到远程接口,就像Web服务一样。这种模式非常适合REST API ,从长远来看,DTO将为你提供更大的灵活性。

该代表的车型领域的应用代表了和模型通过你的API处理的数据是(或者至少应该是)不同的关注点,应该去耦彼此。在应用程序域模型中添加,删除或重命名字段时,你不想破坏API客户端。

当你的服务层在域/持久性模型上运行时,你的API控制器应在一组不同的模型上运行。例如,随着域/持久性模型的发展以支持新的业务需求,你可能希望创建API模型的新版本以支持这些更改。随着新版本的发布,你可能还想弃用旧版本的API。当事物分离时,这是完全有可能实现的。

仅提及公开DTO而不是持久性模型的一些好处:

  • 将持久性模型与API模型分离。
  • DTO可以根据你的需求进行定制,当仅公开持久性实体的一组属性时,它们非常有用。你将不需要诸如@XmlTransient和的注释,@JsonIgnore以避免某些属性的序列化。
  • 通过使用DTO,你将避免在持久性实体中出现批注,也就是说,持久性实体不会因​​与持久性无关的批注而肿。
  • 在创建或更新资源时,你将完全控制要接收的属性。
  • 如果使用的是Swagger,则可以使用@ApiModel和@ApiModelProperty注释来记录你的API模型,而不会弄乱你的持久性实体。
  • 你可以为每个API版本使用不同的DTO。
  • 映射关系时,你将具有更大的灵活性。
  • 你可以为不同的媒体类型使用不同的DTO。
  • 你的DTO可以具有HATEOAS的链接列表。那种事情不应该添加到持久性对象中。使用Spring HATEOAS时,你可以扩展DTO类RepresentationModel(以前称为ResourceSupport)或将其包装EntityModel(以前称为Resource )。

处理样板代码
你无需手动将持久性实体映射到DTO,反之亦然。有很多映射框架,你可以用它来做到这一点。例如,看看基于注释的MapStruct,它可以作为Maven注释处理器使用。它在CDI和基于Spring的应用程序中都能很好地工作。

你可能还需要考虑龙目岛生成getter,setter方法,equals(),hashcode()并toString()为你的方法。



 类似资料:
  • 问题内容: 我目前正在为一个项目创建REST-API,并且一直在阅读有关最佳实践的文章。许多人似乎反对DTO,只是公开域模型,而其他人似乎认为DTO(或用户模型或任何你想称呼的东西)是不好的做法。我个人认为这篇文章很有道理。 但是,我还了解了DTO的所有额外映射代码,域模型可能与其DTO对应对象100%相同的缺点等。 我们主要创建API,以便其他客户端可以使用数据,但是,如果操作正确,我们也将尽可

  • 问题内容: 我正在使用该方法从服务器检索内容。最近,我遇到了一个问题,其中HTTP响应代码指示错误,但是仍然抛出了流,而不是抛出异常。这导致该错误在执行中出现得更晚,并被证明是红色鲱鱼。据我所知,当您使用此方法打开流时,无法检查HTTP响应代码。 我能找到正确处理此问题的唯一方法是 在 打开流 之前 获取连接: 那你同意吗?是否有任何安全使用openStream的良好条件,或者不建议使用openS

  • 问题内容: 我正在使用Selenium的WebDriver为我正在进行自我教育的ASP.NET MVC应用程序运行一些SpecFlow测试。 使用,等都需要很长时间才能运行,所以使用它们实际上非常令人沮丧(我认为)。 我已经读过一个据说比基于浏览器的驱动程序快得多的文件。但我似乎在.NET客户端库(仅Java)中找不到版本。是否有.NET版本? 问题答案: 要使用HtmlUnit,您需要使用Rem

  • 问题内容: 没有它是否有效? 有一个标记页面中某些字段的过程,只是找到了一个页面,其中的输入字段没有按我的预期被标记。 我花了一段时间,但得出的结论是,获取表单元素然后获取字段的过程是导致这些表单丢失的原因,因为没有表单。 问题答案: 如果没有出现,则为有效,是的(至少对于html 4.01,请看17.2.1的结尾): 用于创建控件的元素通常出现在FORM元素内部,但当用于构建用户界面时也可能出现

  • 检查提供的参数是否是有效的JSON。 使用 JSON.parse() 和 try... catch 块来检查提供的参数是否是有效的JSON。 const isValidJSON = obj => { try { JSON.parse(obj); return true; } catch (e) { return false; } }; isValidJSON(

  • 问题内容: 在Windows中,有一个文件(其中一个) 包含Java平台的Java源文件。 OSX中的Java 1.6是否有类似的东西?我想在IDE中指定它,以便可以导航到该源。 问题答案: 在我的系统上,src.jar位于/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home中