我已经从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
答案 0 :(得分:0)
通过在感兴趣的输入组件上设置label
属性,可以覆盖标签。
<h:inputText ... label="Your label" />
这样验证消息的格式如下:
您的标签:验证错误:指定的属性 不在预期值1和999,999
之间
否则它确实会默认为组件的客户端ID。
如果您恰好使用<h:outputLabel>
并且想要使用其确切的值,但又不想将其复制到每个输入组件的label
属性中,那么您可能会发现{ {3}} OmniFaces有帮助。