Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring formBackingObject、业务对象创建和工厂_Java_Spring_Factory Pattern - Fatal编程技术网

Java Spring formBackingObject、业务对象创建和工厂

Java Spring formBackingObject、业务对象创建和工厂,java,spring,factory-pattern,Java,Spring,Factory Pattern,在Spring SimpleFormController中将业务对象用作FormBackingObject的设计问题 我们的控制器的职责是允许最终用户向我们的web应用程序添加新的业务对象 因此,我们通过formBackingObject(HttpServletRequest)方法传递业务对象。然而,我们遇到了一个难题 我们用于创建新业务对象的工厂强制执行某些属性不能为null的业务规则。但由于我们不知道最终用户想要输入什么,我们一直在传递“合理的默认值”,比如“请输入您想要的名称”,但这充其量

在Spring SimpleFormController中将业务对象用作FormBackingObject的设计问题

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

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

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

开发人员应该做什么?我觉得这似乎是典型的鸡/蛋问题

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

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


谢谢您的时间。

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

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

另一种广泛使用的方法是根本不使用业务对象作为formBackingObject,而是创建一个单独的传输对象,其唯一目的是作为formBackingObject(然后为业务对象添加一个工厂方法,允许您从传输对象对其进行初始化)。这样做的一个最大优点是,如果您的业务对象中有一个由其他对象组成的深树,那么将其用作formBackingObject可能会很麻烦。如果您创建一个单独的传输对象只是为了用作formBackingObject,那么您可以为它提供一个更平坦的结构。

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

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


作为参考,请参阅,其中涉及到中的验证和命令对象。

看看这个讨论:因此,我非常同意使用未初始化的业务对象或传输对象,但是如何使用传输对象或死简单的POJO(来自matt b的帖子)与在struts中使用ActionForm不同?在某个时刻,我们将不得不从transport/POJO中提取信息,并将其放入基于hibernate的业务对象实现类中。我问这个问题的唯一原因是因为我记得这是spring的一个主要卖点。我很感激不必扩展ActionForm,但结果和行为在我看来是一样的。这是一个公平的观点。因此,我本人更喜欢使用业务对象作为formBackingObject。另一方面,将数据从一个对象移动到另一个对象的代码不会如此复杂。如果您有一个复杂的业务对象,其中每个表单只填充其中的一部分,那么这种方法可能有意义。