当我尝试将自定义验证器应用于输入字段时,我遇到了一个问题:
我想使用一个由bean生成并绑定到f:validator标签的自定义验证器:
<f:validator binding="#{bean.myValidator}">
对应的bean方法如下:
public Validator getMyValidator(){
return new Validator(){...};
}
如果我像这样在输入标签中使用标签:
<h:input value="...">
<f:validator binding="#{bean.myValidator}" />
</h:input>
那么一切都按预期进行。
但是,如果我以另一种方式使用标签,像这样:
<f:validator binding="#{bean.myValidator}">
<h:input value="...">
</f:validator>
然后我得到一个ServletException ("validatorID是null")。
这个异常的原因是什么?
另外,我不理解相应的f:validator标签规范:
如果这个元素嵌套在一个有其他uiccomponent子组件的uiccomponent标签中,验证器将自动添加到所有的子组件和这个子组件中。
我猜我的f:验证器标签是嵌套在f:视图,正确吗?"对所有子组件"是什么意思?谁的子组件?
这个异常的原因是什么?
我不确定。Mojarra 2.1.3和MyFaces 2.1.1都暴露了同样的问题。当验证器是由<f:validator validatorId="myValidator">
指定的一个独立的@FacesValidator("myValidator")
类时,它会起作用。规范和vdl都描述了这种行为。您可能希望向JSF规范人员发布问题报告,以便在规范或vdl中更详细地说明这一点。
另外,我不理解相应的f:validator标签spec:
如果这个元素嵌套在一个有其他uiccomponent子组件的uiccomponent标签中,验证器将自动添加到所有的子组件和这个子组件中。
我猜我的f:验证器标签是嵌套在f:视图,正确吗?对所有子组件的影响是什么?的意思吗?谁的子组件?
这只是一个糟糕的措辞,无论你想要实现什么,它都支持:在一组组件上包装一个通用的验证器。您可能还想请JSF规范人员进一步澄清这一点。