我的页面上有一些需要交叉验证的字段。但我不希望此验证的错误显示在 <h:message>
中对于这个领域。
如果我将验证器添加到任何字段,并且验证器抛出异常,错误将显示在 <h:message>
中对于这个领域。另一方面,如果我想禁止页面提交,我必须抛出异常。仅显示一些错误消息是不够的。
所以我在表单上创建了一些隐藏字段,并在那里附加了验证器。该验证器可以访问我想要验证的字段的 UIComponent,因此它可以验证它们。当验证器抛出异常时,错误显示在<h:message>
中对于隐藏字段,我可以将其放置在任何我想要的地方。
如果我将隐藏字段放在我想要验证的字段后面,一切都会正常。 (如果我把它放在前面,隐藏字段验证会在更新我的字段的 UIComponent 之前触发)。
问题是它是令人讨厌的黑客:)有更好的方法吗?
最佳答案
The problem is it's nasty hack :) Is there some better way to do it?
不适用于特定的功能需求。确实,JSF 只允许对多个字段的交叉验证进行非常细粒度的控制。
Everything works, if I put hidden field after the fields I want to validate. (If I put it before, hidden field validation is triggered before even UIComponents of my fields are updated).
组件在验证阶段按照组件树中出现的顺序进行处理。如果您在某个时刻有一个 UIInput
尚未处理,那么您需要通过 UIInput#getSubscribedValue()
获取提交的值。如果它已经被处理,那么您需要通过 UIInput#getValue()
获取提交(并转换和验证)的值。
因此,如果您将带有验证器的隐藏字段放在要验证的组件之后,那么您需要 UIInput#getValue()
来获取值。如果隐藏字段放置在要验证的组件之前,则需要 UIInput#getSubscribedValue()
来获取值。
关于validation - 在 JSF 中验证字段并抛出异常,但将错误消息附加到另一个字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4439716/