Spring MVC最佳实践:如何为大型应用程序实现DTOs/ViewModels?

5
假设我们有一个大型Web项目,使用Spring 3.2.4、Hibernate 3.6.10等100多个实体。该项目中的大部分控制器将是基于REST的,并通过JavaScript进行调用。
虽然我认为在概念上直接将实体转换为视图更容易,但实际上使用Jackson时这是非常糟糕的。虽然@JsonIgnore可用于避免无限递归,但有时这个“一刀切”的注释并不适用于整个应用程序 - 我有时需要用手术刀,很多时候一个对象可以以许多方式查看。
此外,即使使用Hibernate模块来解决在使用Hibernate时出现的问题,在使用Spring MVC测试框架时仍然会遇到一些javaassist延迟初始化问题。
所有这些问题都可以通过简单地使用ViewModels或DTOs来避免,所以这是我倾向的方向。不幸的是,创建和维护100多个DTO及其之间的代码映射需要相当大的投入。
我还猜想我将不得不为每个DTO编写自定义的JsonDeserializer类,这也需要相当多的编码和测试工作。
最后,我不确定这是否明智,但我怀疑我的验证规则将从我的实体移到我的视图模型上。我可能永远不会真正需要在我的实际实体上进行验证,但这种方法让我感到不安。
有人可以请指出在这样的项目中实现和映射DTO的最佳实践,并就最佳的处理反序列化的方式提供一些见解吗?我正在寻找能够带来易于维护的代码的做法,希望没有太多手动、耗时的工作。 Martin Fowler的组装器方法对我来说有点过头了。谢谢!
1个回答

3
通常情况下,特别是在大型应用程序中,我们在屏幕上显示的内容(从模型角度来看)与实际的业务组件不同。基本上您想要的是为读取和写入拥有一个不同的域(CQRS 可能是一种方法)。

无法使用单一模型创建用于搜索、报告和处理事务的最佳解决方案(Greg Young)

在过去的工作经验中,对我有效的做法是,为那些区别较大的屏幕/模型创建数据库视图,并在这些视图上实现另一个 hibernate 实体(只读)。确保您可以将其关联回原始业务实体以实现您想要调用的实际业务逻辑。
如果还觉得有些复杂,您可能需要看一下 Dozer ,它可以帮助您从 / 到对象进行映射。这样您就可以在 Java 中维护转换逻辑,而无需自己编写所有映射逻辑(虽然您仍然需要对其进行配置,但这可能会更少痛苦)。
链接
  1. CQRS
  2. CQRS文档 pdf
  3. Dozer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接