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