我需要通过<p: selectOneMenu />
获取<f:attribute>
的值以用于验证器:
<p:selectOneMenu id="tDocument" value="#{usuarioController.persona.tipoDocumento}">
<f:selectItem itemLabel="#{msg.selectOne}" itemValue=""/>
<f:selectItems value="#{tipeListController.tipoIdentificacion}" var="_tDocument" itemValue="#{_tDocument}"/>
</p:selectOneMenu>
<p:inputText id="doc" value="#{usuarioController.persona.num_documento}" required="true" validator="ciRucValidator">
<f:attribute id="idenType" name="identificationType" value="#{usuarioController.persona.tipoDocumento}" />
</p:inputText>
但是当我尝试在验证器中获取它时,我得到null
:
TipoIdentificacion identificationType = (TipoIdentificacion) component.getAttributes().get("identificationType");
这是如何引起的?如何解决?
答案 0 :(得分:1)
在第4阶段“更新模型值”期间设置模型值。但是,验证器在第3阶段“过程验证器”中运行。因此,这是一个阶段。显而易见的是,当时没有其他组件的更新模型值。
规范方法是只传递组件,然后通过UIInput#getValue()
或UIInput#getSubmittedValue()
直接从中提取值,具体取决于组件的顺序。
<p:selectOneMenu binding="#{tDocument}" ...>
...
</p:selectOneMenu>
<p:inputText ... validator="ciRucValidator">
<f:attribute name="tDocument" value="#{tDocument}" />
</p:inputText>
请注意,我删除了<f:attribute id>
,this doesn't exist,并且还注意binding
示例是原样的; very importantingly without a bean property
您可以在验证器中抓取它,如下所示:
UIInput tDocument = (UIInput) component.getAttributes().get("tDocument");
TipoIdentificacion identificationType = (TipoIdentificacion) tDocument.getValue();
// ...
如果需要,这也使您有机会通过setValid(false)
使其他组件无效。