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