Saludos.-

Tengo un inconveniente con JSF y A4J a la hora de llenar elementos de tipo h:selectOneListbox cuando estos son dependientes, es decir, cuando los elementos de uno de estos son llenados segun la seleccion de un valor en otro elemento de este tipo, pero que a su vez este segundo depende de otro. De manera mas clara, tenemos pais, estado, ciudad, cada uno es un selectOneListbox. Al seleccionar un pais, se llena el listbox de estado y al seleccionar el estado se llena el listbox de ciudad.

Actualmente el codigo que tengo hace bien la parte de llenar los estados al seleccionar el pais, pero cuando se selecciona el estado no llega ni el codigoEstado, ni el codigoPais, por lo tanto no se llena la lista de ciudades.

En el JSP tengo el siguiente codigo:

Pais:
<h:selectOneListbox id="paises" value="#{clienteBean.cliente.ciudad.estado.pais.codigo}" required="true" size="1">
<f:selectItems value="#{clienteBean.paises}"></f:selectItems>
<a4j:support event="onchange" reRender="estados" ajaxSingle="true" />
</h:selectOneListbox>
<br/>

Estado:
<h:selectOneListbox id="estados" value="#{clienteBean.cliente.ciudad.estado.codigo}" required="true" size="1">
<f:selectItems value="#{clienteBean.estados}"/>
<a4j:support event="onchange" reRender="ciudades" ajaxSingle="true" />
</h:selectOneListbox>
<br/>
Ciudad:
<h:selectOneListbox id="ciudades" value="#{clienteBean.cliente.ciudad.codigo}" size="1">
<f:selectItems value="#{clienteBean.ciudades}"></f:selectItems>
</h:selectOneListbox>


En el bean

public List<SelectItem> getPaises(){
SelectItem option;
System.out.println("======== getPaises() ========");
paises = new ArrayList<SelectItem>();
try {
paisesX = direccionBf.consultarPaises();

for(PaisTo pais:paisesX){
option = new SelectItem(pais.getCodigo(),pais.getDescripcion());
paises.add(option);
}
} catch (SegurosCaracasException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return paises;
}

public List<SelectItem> getEstados(){
SelectItem option;
System.out.println("======== getEstados() ========");
codigoPais = cliente.getCiudad().getEstado().getPais().getCodigo();
System.out.println("Codigo pais " + cliente.getCiudad().getEstado().getPais().getCodigo());
estados = new ArrayList<SelectItem>();
try {
if(cliente.getCiudad().getEstado().getPais().getCodigo() == 1){
estadosX = direccionBf.consultarEstados();
for(EstadoTo estado:estadosX){
option = new SelectItem(estado.getCodigo(),estado.getDescripcion());
estados.add(option);
}
}else{
option = new SelectItem(new Long(-1),"Seleccione");
estados.add(option);
}

} catch (SegurosCaracasException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return estados;
}

public List<SelectItem> getCiudades(){
SelectItem option;
ciudades = new ArrayList<SelectItem>();
System.out.println("======== getCiudades() ========");
System.out.println(">>>> Estado " + cliente.getCiudad().getEstado().getCodigo());
System.out.println(">>>> Pais " + cliente.getCiudad().getEstado().getPais().getCodigo());

try {
if(cliente!=null && cliente.getCiudad()!=null && cliente.getCiudad().getEstado()!=null && cliente.getCiudad().getEstado().getCodigo()>0){ //Si hay un codigo de estado
ciudadesX = direccionBf.consultarCiudades(cliente.getCiudad().getEstado().getCodigo());
}else{
CiudadTo c = new CiudadTo();
c.setCodigo(-1);
c.setDescripcion("Seleccione...");
ciudadesX = new ArrayList<CiudadTo>();
ciudadesX.add(c);
}

for(CiudadTo ciudad:ciudadesX){
option = new SelectItem(ciudad.getCodigo(),ciudad.getDescripcion());
ciudades.add(option);
}
} catch (SegurosCaracasException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ciudades;
}


Gracias de antemano.