この リッチフェイスの例と非常によく似た何かをしようとしています。定義済みのもののいずれかを選択していない場合に備えて、カスタム 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
がnullであることがわかります。
reRender
変数への値の設定が非同期に行われ、競合状態が発生するということですか? そして、この場合の正しい解決策は何ですか?