2013-03-13 68 views
0

我编写了一个自定义验证器来验证所有表单字段。我正在使用Incefaces 3.2和JSF 2.0。我注意到整数类型的UIInput有多个问题。如果我没有在表单中输入任何数据并点击提交,我可以使用myUIInput.getValue()检查自定义验证器中的字段值并启动所需的验证。UIInput的isLocalValueSet总是在自定义验证器中返回true

当我在字段中输入一些值并提交时,我在我的自定义验证器中使用getSubmittedValue()来验证它。到现在为止还挺好。当我从UI中删除该字段的值并将其提交后,getValue()仍然保留旧值。 isLocalValueSet()总是返回null。

我试过在第一次启动验证后重置下面的内容。它也没有帮助。

 myInput.setValue(null); 
     myInput.setSubmittedValue(null); 
     myInput.setLocalValueSet(false); 

如何将我的字段状态重置为初始值?如何在启动验证后正确设置isLocalValueSet()?提前致谢。

回答

1

JSF组件按它们出现在组件树中的顺序进行验证。鉴于您正在使用getSubmittedValue(),这只能意味着您的自定义验证程序在之前被触发了任何组件都已被处理。也许你已经将验证器附加到表单开头的隐藏输入中。

这意味着,当您的自定义验证器完成后,JSF将继续处理组件树中的所有后续组件,从而以“常规方式”重做每个单独组件的整个验证过程,因此会覆盖组件的状态从您的自定义验证器上操作。

我不知道具体的功能需求是什么,为什么你需要接近它这样的,这是有点臭,但你可以理论上所有组件都被处理后烧制自定义验证解决它。并处理getValue()而不是getSubmittedValue()。再一次,具体的功能要求太不明确,无法提出任何设计改进。

+0

感谢BalusC。我们在我们的jsf2,Icefaces 3应用程序的某些形式上使用JSR 303 bean验证。我们遇到了控制验证顺序的问题。我想删除所有验证,但请求对象(dto)与项目的其他类紧密耦合。我们已经接近完成项目的包装了,如果没有bean验证,创建新的dto已经太迟了。所以,我写了一个自定义验证器,例如。 – Superman9999 2013-03-20 00:33:52

+0

每次我提交表单时都会触发此验证器。如果未输入任何值,我的客户添加了最后一分钟的要求以显示整数字段为空白。如果验证(必需或格式)失败,它必须设置为空白。出于某种原因,getValue()和getSubmittedValue()没有正确更新整型字段。我没有字符串或日期字段的问题。作为解决方法,我在UI上使用了一个字符串,如果它是一个有效的int值,则将其更改回整数。我还没有探索添加转换器的路线。 – Superman9999 2013-03-20 00:34:20