Вы ничего не пропустили. Вы просто что-то слишком много. Чтобы заставить его работать, вы должны удалить immediate="true"
из компонентов, подлежащих замене.
<h:selectOneMenu value="#{member.dependentName}" onchange="this.form.submit()"
immediate="true" valueChangeListener="#{member.getDependentAddress}">
<f:selectItems value="#{member.dependentList}" />
</h:selectOneMenu>
<h:inputText value="#{member.personName}" />
<h:inputText value="#{member.dob}" />
immediate="true"
в компоненте UIInput
приведет к тому, что фаза его проверки будет проходить в фазе применения значений запроса. Это дает вам возможность использовать FacesContext#responseComplete()
внутри метода valueChangeListener
, пропуская другие компоненты, для которых immediate="true"
не установлен из обработки. Как и сейчас, с immediate="true"
они также обрабатываются.
Пожалуйста, обратите внимание, что это, по сути, взлом старой версии JSF 1.x. Если вы уже используете JSF 2.x, вам следует использовать <f:ajax listener>
.
<h:selectOneMenu value="#{member.dependentName}">
<f:selectItems value="#{member.dependentList}" />
<f:ajax listener="#{member.getDependentAddress}" render="name dob" />
</h:selectOneMenu>
<h:inputText id="name" value="#{member.personName}" />
<h:inputText id="dob" value="#{member.dob}" />
с
public void getDependentAddress() {
Dependent dependent = getDependentsList().get(dependentName); // Isn't that actually a Map instead of List?
personName = dependent.getDependentName();
dob = dependent.getBirth();
}