gpt4 book ai didi

java - 大型应用程序实现 DTO/ViewModel 的 Spring MVC 最佳实践?

转载 作者:搜寻专家 更新时间:2023-10-31 20:20:55 27 4
gpt4 key购买 nike

假设我们有一个大型 Web 项目,其中包含 100 多个使用 Spring 3.2.4、Hibernate 3.6.10 等的实体。该项目中的大部分 Controller 都将基于 REST 并通过 JavaScript 调用。

虽然我认为直接将实体编码/取消编码到 View 在概念上更容易,但事实证明,在使用 Jackson 时,这在实践中非常糟糕。虽然 @JsonIgnore 可用于避免无限递归,但有时这种“一刀切”的注释对整个应用程序并不适用——有时我需要一 Handlebars 术刀,而且很多时候可以查看一个对象在许多方面。

此外,尽管在使用 Hibernate 时使用了 Jackson 的 Hibernate 模块来解决问题,但在使用 Spring MVC 测试框架时我仍然遇到一些 javaassist 延迟初始化问题。

所有这些问题都可以通过简单地使用 ViewModelsDTO 来避免,所以这是我倾向于的方向。不幸的是,创建和维护 100 多个 DTO 以及相互映射的代码是一项相当大的投资。

我还猜测我将不得不为这些 DTO 中的每一个编写自定义 JsonDeserializer 类,这也是相当多的编码和测试工作。

最后,我不确定这是否明智,但我怀疑我的验证规则将从我的实体转移到我的 View 模型上。我可能永远不需要对我的实际实体进行验证,但这种方法让我感到紧张。

有人可以强调在这样的项目中实现和映射 DTO 的一些最佳实践,并提供一些关于处理反序列化的最佳方法的见解吗?我正在寻找导致代码易于维护的实践,并且希望不会有大量耗时的体力劳动。 Martin Fowler 的汇编程序方法对我来说有点过分。谢谢!

最佳答案

通常,至少在较大的应用程序中是我的经验,我们在屏幕上显示的内容(在模型方面)与实际业务组件不同。您基本上想要的是用于读取和写入的不同域(CQRS 可能是一种方式)。

It is not possible to create an optimal solution for searching, reporting, and processing transactions utilizing a single model (Greg Young)

过去对我有用的是,为那些差异很大的屏幕/模型创建一个数据库 View ,并简单地在这些 View 上实现另一个 hibernate 实体(只读)。确保您可以关联回原始业务实体以获取您要调用的实际业务逻辑。

如果这也有点多,您可能想看看 Dozer这可以帮助您从/到对象进行映射。这样您就可以在 Java 中维护转换逻辑,而不必自己编写所有映射逻辑(您仍然需要配置它,但这可能不那么痛苦)。

链接

  1. CQRS
  2. CQRS 文档 pdf
  3. Dozer

关于java - 大型应用程序实现 DTO/ViewModel 的 Spring MVC 最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19086785/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com