第二个组件的验证器中第一个输入组件的模型值为空

时间:2015-07-28 17:51:27

标签: validation jsf jsf-2 primefaces

我需要通过<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");

这是如何引起的?如何解决?

1 个答案:

答案 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)使其他组件无效。

另见: