我有一个丰富的:tabpanel和几个标签。 tabpanel的类型设置为“client”。在每个选项卡中,都有一些h:inputText。
我想做的是显示错误,如“Tab:Tab1 [,Tab2 [,Tab3 ...]]有错误,请在保存前更正错误。”如果所有标签中都有错误。我尝试通过AjaxListener(Seam)或PhaseListener实现这一点(两者都可以实现我想做的事情)。
问题在于,当某些输入标记为immediate =“true”时,这些输入首先被验证,并与那些具有immediate =“false”的输入分开验证。除非那些“immediated”输入不包含错误,否则“非直接”输入将不会被验证。
有没有办法强制jsf验证器验证某些commandButton上的所有输入?或者有没有办法覆盖jsf的默认验证器?
答案 0 :(得分:0)
JSF中没有“默认验证器”,每个组件都会负责自己的转换和验证(如果有的话)。组件具有在JSF lifecycle的每个阶段中调用的回调,并且这些回调为组件树中的每个组件调用验证和转换逻辑(因此没有集中式转换器或验证器)。
immediate=false
的输入组件在 Process Validations 阶段(生命周期中的第三个)期间执行验证和转换,而immediate=true
的输入组件在中执行验证和转换>应用请求值阶段(生命周期中的第二个阶段)。
JSF生命周期的“问题”(实际上是设计约束)是,无论何时在任何阶段发现错误,框架都会直接跳转到渲染响应阶段而不执行剩余的阶段,所以如果在immediate=true
输入中发现任何错误(第二阶段),则永远不会调用第三阶段。
没有解决方法,您需要输入所有输入immediate=false
或immediate=true
,以便所有验证都在同一阶段进行。我建议坚持immediate=false
,除非你有充分的理由不这样做。例如,无论输入的验证状态如何,您都需要执行操作,请执行commandButton immediate=true
。