假设我们有一个使用 Spring 3.2.4、Hibernate 3.6.10 等的包含 100 多个实体的大型 Web 项目。该项目中的大多数控制器将基于 REST,并将通过 JavaScript 调用。
虽然我认为在概念上直接将实体编组/取消编组到视图更容易,但事实证明,在使用 Jackson 时,这在实践中非常糟糕。虽然@JsonIgnore 可用于避免无限递归,但有时这种“一刀切”的注释对整个应用程序并不完全适用——有时我需要一把手术刀,而且很多时候可以查看一个对象很多方面。
此外,尽管在使用 Hibernate 时使用 Jackson 的 Hibernate 模块来解决问题,但javaassist
在使用 Spring MVC 测试框架时我仍然会遇到一些延迟初始化问题。
以上所有这些问题都可以通过简单地使用ViewModels
or来避免DTOs
,所以这就是我倾向于的方向。不幸的是,创建和维护 100 多个 DTO 以及相互映射的代码是一项相当大的投资。
我还猜测我将不得不JsonDeserializer
为每个 DTO 编写自定义类,这也是相当多的编码和测试。
最后,我不确定这是否明智,但我怀疑我的验证规则将从我的实体转移到我的视图模型上。我可能永远不需要对我的实际实体进行验证,但这种方法让我感到紧张。
有人可以强调一些在此类项目中实施和映射 DTO 的最佳实践,并就处理反序列化的最佳方法提供一些见解吗?我正在寻找能够导致易于维护的代码的实践,并且希望不是大量的手动、耗时的劳动。Martin Fowler 的汇编方法对我来说有点多。谢谢!