4

Spring 的表单控制器(例如SimpleFormControllerBaseCommandController)使用命令在 HTML 表单和控制器之间传递数据。我的问题是,使用支持模型作为命令本身是常见的做法吗?或者创建一个具有与支持模型中的属性对应的属性的单独命令是否很常见。

我的问题是要使用支持模型作为命令,属性编辑器对于转换非字符串属性是必需的。想象一个具有许多非字符串强类型自定义字段类型的数据模型。在提交表单时,属性编辑器会在调用验证器之前进行转换。如果无法进行类型转换(用户输入错误),那么验证器将永远没有机会提供详细的错误消息。HTML 表单上显示的只是一般的错误消息。请参阅我相关的 Stackoverflow 问题

另一种方法是创建一个单独的命令来复制支持模型中的每个字段,但作为一个字符串。通过这种方式,验证器可以验证每个字段的字符串表示。然后控制器onSubmit负责将基于文本的命令转换为支持模型。从我对 Spring 的研究来看,这似乎是预期的用途。我对走这条路的犹豫是需要为每个数据模型创建单独的命令的繁琐方式。然后是必须在命令和数据模型之间编组的额外工作。让表单直接编辑支持模型并使用属性编辑器进行转换要方便得多。那么问题是验证。

所以我很好奇其他人如何处理包含自定义类型非字符串字段的基于表单的模型编辑问题。

4

2 回答 2

3

我建议您查看Spring binding and validation API。将表单元素绑定到服务层需要的对象中,并让控制器传递它们。

我的偏好是直接绑定到业务对象,而不是仅仅为了 Web 层而创建 DTO。我不喜欢并行层次结构。

于 2009-04-09T23:49:22.670 回答
2

恕我直言,这归结为您希望如何设计域类。我更喜欢通过甚至不允许设置不适当的值等来严格设计它们。这与 Spring 处理绑定和验证的方式结合得不是很好。

由于我想避免削弱我的域模型,我倾向于使用 DTO 作为命令对象,因为通常演示文稿对域对象的看法略有不同。经典示例是带有密码的 User 域类。在表示层中,您通常希望让实际用户输入两次密码并在验证步骤中比较这些值。只有当它们正确匹配时,数据才会绑定到域类。

可能会引入一些开销,但允许将域/应用程序层与视图完全分离。

于 2009-04-30T20:05:44.933 回答