selectOneMenu在更改后将字段设置为null

时间:2013-02-10 13:24:52

标签: jsf richfaces seam

我尝试执行与this richfaces 示例非常相似的操作。我有一个描述自定义ID验证的表单,如果您没有选择其中一个预定义的,则表单将被禁用。因此,表单成员的禁用表达式将转到下一个方法:

public boolean isPredefinedValidator() {
    return !currentProjectRegField.getIdValidation().getIdType().equals(IdValidatorType.NONE);
}

这样调用:

disabled="#{accountHome.isPredefinedValidator()}"

,这是预定义验证器的选择器:

<h:selectOneMenu value="#{accountHome.currentProjectRegField.idValidation.idType}"
    rendered="#{!(empty accountHome.currentProjectRegField or empty accountHome.currentProjectRegField.idValidation)}">
    <a4j:support event="onchange" reRender="customIdValidator"/>
        <s:convertEnum />
            <s:enumItem enumValue="NONE" label="#{messages['IdValidatorType_enum.NONE']}"/>
            <s:enumItem enumValue="USA_ID" label="#{messages['IdValidatorType_enum.USA_ID']}"/>
            <s:enumItem enumValue="MEXICO_ID" label="#{messages['IdValidatorType_enum.MEXICO_ID']}"/>
</h:selectOneMenu>

问题是,当isPredefinedValidator()重新呈现(在禁用的EL上)上调用方法a4j时,我会收到NPE。

Caused by: java.lang.NullPointerException
at com.whatever.something.action.AccountHome.isPredefinedValidator(AccountHome.java)

当我尝试调试时 - 证明从selectOneMenu设置的值为空。

这是否意味着reRender和变量的设置值发生异步,并且存在竞争条件?对于这种情况,什么是正确的解决方案?

1 个答案:

答案 0 :(得分:0)

包含rich:modalPanel的{​​{1}}中的某些黑魔法配置解决了此问题。它就像这个h:selectOneMenu