Spring“类型不匹配”和必填字段

Posted

技术标签:

【中文标题】Spring“类型不匹配”和必填字段【英文标题】:Spring "typemismatch" and required fields 【发布时间】:2011-04-07 09:47:15 【问题描述】:

在 Spring Webflow 2.0.x 的上下文中......

我通过在我的messages.properties 中使用以下内容来处理表单绑定“类型不匹配”,即尝试将字符串映射到整数字段的结果

typeMismatch=0 contains invalid data.

这很好用。

问题是,如果发生typeMismatch 错误的字段是“必填”,那么我也会收到缺少必填字段的错误,我猜这是合乎逻辑的,因为提交的值从未绑定。 (“必需”在 Commons Validation XML 文件中定义)

所以,当字段仅由于类型不匹配而丢失时,我不想看到 “XXX 是必填字段” 错误消息。我该如何解决这个问题?我曾想过在 FormAction 上覆盖 initBinder(),但很快就没有结果.....

【问题讨论】:

这方面有什么进展吗?我目前正在与同样的问题作斗争。 可以发一个小项目的例子吗? 【参考方案1】:

就像 Yves 提到的,在这三种方法中,我使用了自定义验证器方法,而且非常简单。您可以使用自定义验证器来检查表单字段是否已包含必需的 xml 错误消息。如果该字段没有错误,那么您可以检查您的字符串验证。这样它只会显示一个。

您可以使用的另一种方法是尝试多重 xml 验证,一种是必需的,另一种是检查特定正则表达式的掩码。在您的情况下,如果您的字段是整数字段,那么您可以使用正则表达式执行掩码,仅检查数字。 xml 中掩码(必需或必需)的顺序决定了哪个消息获得更高的偏好。

例如:

<field property="somefield" depends="required,mask" page="2">
<arg key="somelabel"/>
<var>
    <var-name>mask</var-name>
    <var-value>$somepattern</var-value>
</var>
</field>

【讨论】:

【参考方案2】:

您有很多选择,按优先顺序排列:

在资源文件中选择性地设置消息typeMismatch.target.yourFieldNametypeMismatch.int

实现您的own Validator,以便在绑定步骤之前整数解析失败时发送专用消息

创建一个BindingErrorProcessor来处理不同的kind of parsing issues

【讨论】:

正常的链配置是先验证者,再绑定。也许你的换了。 验证者为他们的消息使用了“必需的”资源 所以,我在字段顶部有@Required,然后我得到了 typeMismatch 验证错误。我是怎么做到的,只显示关于 typeMismatch 错误的消息,而不显示所需的错误消息? 所以,我在持久性类中有一个变量,我在整数 xy 顶部有注释 @NotNull。我给一个字符串,让我们说“foo”并尝试保存。我得到两个错误:一个关于 typeMismatch 和另一个字段是必需的。就像在主要问题中一样。 问题是关于 Commons Validator 的 @Required 注解,而不是 Hibernate 的 @NotNull...

以上是关于Spring“类型不匹配”和必填字段的主要内容,如果未能解决你的问题,请参考以下文章

SpringFox Swagger - 模型中的可选和必填字段

带有嵌套可选对象和必填字段的猫鼬模式

为啥此字段验证类型不匹配?

gob:类型不匹配:没有匹配的字段编译解码器 - Golang

访问 VBA - 使用组合框(多值字段)时类型不匹配

NSPredicate 和 BEGINSWITH with CloudKit:字段值类型不匹配