Pessoas,
estou tentando fazer um combo de estados atualizar dinamicamente o de cidades através do ajax4jsf. Quero manter o list de estados dentro de um mbean e o de cidades em outro, para poder reutilizá-los.
Porém, estou tendo um problema, pois o cidadeMBean está sempre com o objeto estado null, logo não consigo filtrar as cidades pelo estado.
Segue abaixo o código do que estou tentando fazer:
<h:selectOneMenu id="estado" value="#{pessoaMBean.pessoa.estado}" styleClass="selectComum" style="width:45px;">
<f:selectItems value="#{estadoMBean.comboEstados}" />
<a4j:support event="onchange" action="#{cidadeMBean.load}" ajaxSingle="true" reRender="cidade"/>
</h:selectOneMenu>
<h:selectOneMenu id="cidade" value="#{pessoaMBean.pessoa.cidade.id}" styleClass="selectComum" style="width:45px;">
<f:selectItems value="#{cidadeMBean.comboCidades}" />
</h:selectOneMenu>
public class CidadeMBean {
private List<SelectItem> comboCidades;
private List<Cidade> cidades;
private Cidade cidade;
private CidadeDAO cidadeDAO;
private Estado estado;
private static final Logger log = Logger.getLogger(CidadeMBean.class);
public void load() {
CidadeMBean.log.info("load() estado: " + estado);
this.comboCidades = cidadeDAO.getSelectListCidadesByEstado(estado);
}
public List<SelectItem> getComboCidades() {
CidadeMBean.log.info("getComboCidades() estado: " + estado);
load();
CidadeMBean.log.info("apos load()" + comboCidades.size());
return comboCidades;
}
// ...
}
@Transactional
public class EstadoMBean {
private List<SelectItem> comboEstados;
private List<Estado> estados;
private Estado estado;
private EstadoDAO estadoDAO;
private static final Logger log = Logger.getLogger(EstadoMBean.class);
public List<Estado> getEstados() {
this.estados = estadoDAO.getListEstados();
EstadoMBean.log.info("getEstados()" + estados.size());
return estados;
}
public void setEstados(List<Estado> estados) {
this.estados = estados;
}
public List<SelectItem> getComboEstados() {
this.comboEstados = estadoDAO.getSelectListEstados();
EstadoMBean.log.info("getComboEstados()" + comboEstados.size());
return comboEstados;
}
// ...
}