У меня такая же ситуация. В конечном итоге я решил использовать jsFunction в сочетании с методом действия в компоненте поддержки.
Во-первых, значение ID будет загружено в поле автозаполнения на короткое время. JS-функция onselectitem называется. Атрибут execute функции jsFunction гарантирует, что извлеченное значение идентификатора будет привязано к полю вспомогательного компонента перед вызовом моего действия populateEmployee. populateEmployee оборачивается, перемещает значение идентификатора в поле туда, куда я хочу, и заменяет значение поля автозаполнения тем, что я в конечном итоге хочу отображать (в данном случае, именем). Затем поле автозаполнения имени будет перерисовано.
В зависимости от того, насколько быстро ваша бэкэнд-система справляется с поиском идентификатора сотрудника, базовый идентификатор будет отображаться на короткое время, пока выполняется ваш эквивалент populateEmployee. Но это настолько близко, насколько я могу найти приемлемое (в моем случае) рабочее решение.
JSF:
<a4j:jsFunction name="chooseEmployee" execute="employeeSearchName" action="#{employeeSearchBean.populateEmployee}" render="selectedEmployeeId employeeSearchName"/>
<rich:autocomplete id="employeeSearchName" mode="ajax" minChars="3"
autocompleteMethod="#{employeeSearchBean.searchEmployees}" var="emp"
autofill="false" layout="table"
fetchValue="#{emp.employee.id}" value="#{employeeSearchBean.selectedEmployeeName}"
onselectitem="chooseEmployee()">
... output columns ...
</rich:autocomplete>
<h:outputText id="selectedEmployeeId" value="#{employeeSearchBean.selectedEmployeeId}"/>
Фасоль:
private String selectedEmployeeName;
private Integer selectedEmployeeId;
public void populateEmployee() {
selectedEmployeeId = Integer.parseInt(selectedEmployeeName);
for (EmployeeSearchEntry entry : data) {
if (entry.getEmployee().getId().equals(selectedEmployeeId)) {
selectedEmployeeName = entry.getNameLfm();
break;
}
}
}