Spring formBackingObject,业务对象创建和工厂

时间:2009-11-11 18:02:27

标签: java spring factory-pattern

设计在Spring SimpleFormController中使用Business Objects作为formBackingObjects的问题。

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

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

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

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

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

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

感谢您的时间。

2 个答案:

答案 0 :(得分:2)

我绝对不会选择不使用formBackingObject并手动收集信息 - 这将消除使Spring MVC成为首要价值的大量功能。

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

另一种广泛使用的方法是根本不使用业务对象作为formBackingObject,而是创建一个单独的传输对象,其唯一目的是成为formBackingObject(然后为您的业务对象添加一个工厂方法,让您从传输对象初始化它)。这样做的一个重要优点是,如果您的业务对象中包含其他对象的深层树,这可能会使用它作为formBackingObject变得很麻烦。如果你创建一个单独的传输对象只是用作formBackingObject,你可以给它一个更扁平的结构。

答案 1 :(得分:1)

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

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

供参考,请参阅the MVC tutorial,其中涉及Part 4中的验证和命令对象。