1

我已经从 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 加上前缀,但我认为它对我没有任何用处。我从博客 Communication in JSF 2.0 中了解到,这些标签处理程序在 JSF 2.0 中无法正常工作,因此我们应该使用 f:validator 创建自定义验证器

我从这里关注了 BalusC 的回答;唯一的区别是我没有从 bean 中获取我的最大值和最小值,我在 xhtml 中指定了它们,它仍然如上所述打印验证消息。

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

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

我仍在学习曲线上,谁能解释一下为什么 MessageFactory.getMessage 将这些 ID 绑定到面部消息的原因和位置?请告知,Dakshata Gulkhobare

4

1 回答 1

0

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

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

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

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

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

如果您碰巧<h:outputLabel>已经使用并希望准确使用它的值,但又不想将其复制到label每个输入组件的属性中,那么您可能会发现OmniFaces <o:outputLabel>很有帮助。

于 2012-06-13T15:16:03.727 回答