我已经从 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