如果我使用JSF 2.0.4,我应该在faces-config.xml
注册自定义验证器吗?
我的自定义验证器使用Validator接口javax.faces.validator.Validator
。
<cc:myComp id="customcomp1" ... />
<cc:myComp id="customcomp2" ...>
<f:validator id="myvalidator" for="myComp" />
</cc:myComp>
myComp.xhtml
<cc:interface>
<cc:attribute ... />
<!-- more attributes -->
</cc:interface>
<cc:implementation>
<h:panelGroup layout="block">
<h:inputText id="firstName" ... />
<h:inputText id="middleName" ... />
<h:inputText id="lastName" ... />
</h:panelGroup>
</cc:implementation>
答案 0 :(得分:5)
根据更新后的问题中的代码示例,您似乎根本没有将验证器委托给正确的输入,因此完全忽略验证器。
您需要在<composite:interface>
中将{02}定义为所需的输入(您要为其附加验证码)。
<cc:interface>
<cc:editableValueHolder name="forName" targets="inputId" />
...
</cc:interface>
<cc:implementation>
...
<h:inputText id="inputId" ... />
...
</cc:implementation>
以上<composite:editableValueHolder>
基本上告知必须在<f:validator for="forName">
上应用任何<h:inputText id="inputId">
。那么,以下应该这样做:
<cc:myComp>
<f:validator id="myValidator" for="forName" />
</cc:myComp>
您甚至可以在name
和targets
中使用相同的值,但关键点是必须存在<composite:editableValueHolder>
,以便JSF知道哪个输入组件与验证器完全相同应该是目标,复合中可以有多个输入组件,你看。
答案 1 :(得分:3)
如果您正在使用JSF 2,我认为您不需要触摸faces-config.xml
文件来创建客户Validator
。您只需使用注释@FacesValidator
即可声明Validator
。它应该是这样的:
@FacesValidator("myValidator")
public class MyValidator implements Validator {
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
// Your logic
}
}
然后您可以在.xhtml页面中开始使用它,例如<f:validator>
标记:
<f:validator validatorId="myValidator" />
答案 2 :(得分:1)
没有。 Jsf 2.0没有必要这样做。只需使用@FacesValidator
为您的验证者添加注释即可。注释会自动注册验证器。不需要xml。