我尝试做一些与richfaces示例非常相似的事情。我有一个表单描述了自定义ID验证,以防您没有选择预定义的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()
在a4j
转发器上调用时(在禁用的EL上),我会收到NPE。
Caused by: java.lang.NullPointerException
at com.whatever.something.action.AccountHome.isPredefinedValidator(AccountHome.java)
当我尝试调试时,发现从selectOneMenu
设置的值为null。
这是否意味着reRender
和变量的设置值发生异步,并且存在竞争条件?对于这种情况,正确的解决方案是什么?
包含h:selectOneMenu
的rich:modalPanel
中的一些黑魔法配置解决了此问题。它是这样的<rich:modalPanel ... domElementAttachment="form">