自升级到JSF2.0以来,使用f:validateDoubleRange时,客户端ID:FormID:ComponentID位于验证消息之前

时间:2012-06-13 13:54:39

标签: jsf jsf-2

我已经从JSF 1.1升级到JSF 2.0。之前我使用的是f:validateLongRange或f:validateDoubleRange,验证工作正常。但是,由于我已迁移到JSF 2.0,验证消息先于客户端ID,如下所示: FormID:ClientID:0:在我的情况下,ComponentID,消息显示为

premiumCategory:j_idt368:0:tlNewLOS: Validation Error: Specified attribute
                is not between the expected values of 1 and 999,999.

有一个Jira谈论为ClientID加前缀,但我不认为它对我有用。 我从JSF 2.0中的博客中了解到这些标记处理程序在JSF 2.0中无法正常工作,因此我们应该使用f:validator

创建自定义验证程序

我跟随了来自here的BalusC的回答;唯一的区别是我没有从bean中获取我的max和min值,我在xhtml中指定了它们,它仍然打印了如上所述的验证消息。

在调试时我意识到客户端ID是作为FormID生成的:ClientID:0:ComponentID并存储在UIComponent实例中,该实例将传递给MessageFactory.getMessage方法。 我之前提到过的同一个博客中有一个主题是“Ajax渲染外部形式的内容”,我认为这可以解决我的问题,但再次没有运气。

现在我有自己的自定义验证器类,它扩展到DoubleRangeValidator并覆盖validate方法。我得到了所需的信息。但是,我不相信为每个f:validatorXXXX组件编写自定义验证器是解决方案。

我仍然在学习曲线上,任何人都可以解释我为什么以及MessageFactory.getMessage将这些ID绑定到faces消息的位置? 请指教, Dakshata Gulkhobare

1 个答案:

答案 0 :(得分:0)

通过在感兴趣的输入组件上设置label属性,可以覆盖标签。

<h:inputText ... label="Your label" />

这样验证消息的格式如下:

  

您的标签:验证错误:指定的属性                   不在预期值1和999,999

之间

否则它确实会默认为组件的客户端ID。

如果您恰好使用<h:outputLabel>并且想要使用其确切的值,但又不想将其复制到每个输入组件的label属性中,那么您可能会发现{ {3}} OmniFaces有帮助。