Spring MVC实现DTO / ViewModels for Large应用程序的最佳实践?

时间:2013-09-30 05:08:25

标签: java spring spring-mvc jackson viewmodel

假设我们有一个包含超过100个实体的大型Web项目,使用Spring 3.2.4,Hibernate 3.6.10等。此项目中的大多数控制器都将基于REST并将通过JavaScript调用。

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

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

只需使用ViewModelsDTOs就可以避免上述所有问题,这就是我倾向于的方向。不幸的是,创建和维护100多个DTO以及映射到和来的代码是一项相当大的投资。

我也猜测我必须为每个DTO编写自定义JsonDeserializer类,这也是相当多的编码和测试。

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

有人可以强调一下在这样的项目中实施和映射DTO的一些最佳实践,并且还提供一些有关处理Deserializion的最佳方法的见解吗?我正在寻找能够轻松维护代码的实践,并且希望不会耗费大量手动,耗时的工作。 Martin Fowler的汇编方法对我来说有点多。谢谢!

1 个答案:

答案 0 :(得分:3)

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

  

使用单一模型(Greg Young)无法为搜索,报告和处理交易创建最佳解决方案

过去对我有用的是,为那些不同的屏幕/模型创建数据库视图,并在这些视图上简单地实现另一个hibernate实体(只读)。确保您可以将原始业务实体与您要调用的实际业务逻辑关联起来。

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

链接

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