1

在 Spring SimpleFormController 中使用业务对象作为 formBackingObjects 的设计问题。

我们的控制器的职责是允许最终用户向我们的 Web 应用程序添加新的业务对象。

所以我们通过 formBackingObject(HttpServletRequest request) 方法传递我们的业务对象。然而,我们遇到了一个难题。

我们用来创建新业务对象的工厂强制执行某些属性不能为空的业务规则。但是由于我们不知道最终用户想要输入什么,我们一直在传递“合理的默认值”,比如“请输入你想要的名称”,但这似乎充其量是 hackie/icky。

开发人员要做什么?我觉得这好像是经典的鸡/蛋问题。

我们所有的业务对象都是基于接口的,我们是否应该创建一个代表业务对象的存根,将存根作为 formBackingObject 传递,然后在表单提交时将存根传递给工厂?或者我们不应该在 formBackingObject 中传递任何东西,然后从请求中手动收集提交的信息?

还有其他合理的想法/模式吗?

感谢您的时间。

4

2 回答 2

2

我绝对不会选择不使用 formBackingObject 并手动收集信息的选项——这会首先消除使 Spring MVC 有价值的许多功能。

如果我是你,我会创建一个新工厂或工厂方法,专门设计用于创建“未初始化”业务对象,并将其用作您的 formBackingObject。

另一种广泛使用的方法是根本不使用业务对象作为您的 formBackingObject,而是创建一个单独的传输对象,其唯一目的是作为 formBackingObject(然后为您的业务对象添加一个工厂方法,让您从运输对象)。这样做的一大优点是,如果您的业务对象内部有其他对象的深层树,那么将其用作 formBackingObject 会很痛苦。如果您创建一个单独的传输对象仅用作 formBackingObject,您可以给它一个更扁平的结构。

于 2009-11-11T19:09:05.300 回答
1

使用命令对象(一个非常简单的 POJO)来表示用户对控制器的输入。然后,您可以使用 Spring MVC 内置的验证来确保在命令对象中提供了所有必需的字段。如果命令通过验证,那么您可以通过编程方式将其映射到您的“业务对象”(或使用像Dozer这样的 bean 映射库)。

这样您就可以处理验证、不完整的用户提交等,而无需触及或修改任何现有的业务逻辑/规则/服务类。这允许您将 Web 图层与这些现有图层分开。

如需参考,请参阅MVC 教程,其中涉及第 4 部分中的验证和命令对象。

于 2009-11-11T19:10:01.550 回答