Bom, vou mostrar todo o meu codigo, pra ver se juntos descobrimos um porque
Este é o managed bean:
@ManagedBean
@RequestScoped
public class UsuarioBean {
private Usuario usuario = new Usuario();
private String confirmarSenha;
private int idEstadoSelecionado;
private int idCidadeSelecionada;
private List<SelectItem> estados;
private List<Estado> estadosObj;
private Cidade[] cidades;
private Cidade cidade;
private Endereco endereco = new Endereco();
public List<SelectItem> getEstados() {
if (estados == null) {
estados = new ArrayList<SelectItem>();
estadosObj = new EstadoDAO().buscaTodosEstados();
for (Estado e : estadosObj) {
estados.add(new SelectItem(e.getId(), e.getNome()));
}
}
return estados;
}
public void setEstados(List<SelectItem> estados) {
this.estados = estados;
}
public Cidade[] getCidades() {
List<Cidade> aux = new CidadeDAO()
.buscarCidadesPorEstado(idEstadoSelecionado);
cidades = (Cidade[]) aux.toArray(new Cidade[aux.size()]);
return cidades;
}
public String novo() {
return "usuario";
}
public String salvar() {
FacesContext context = FacesContext.getCurrentInstance();
if (!confirmarSenha.equals(usuario.getSenha())) {
FacesMessage facesMessage = new FacesMessage(
"A senha não foi confirmada corretamente");
context.addMessage(null, facesMessage);
return null;
}
endereco.setCidade(cidade);
usuario.setEndereco(endereco);
new UsuarioRN().salvarUsuario(usuario);
return "sucesso";
}
//gets e set omitidos em sua maioria
}
Agora o trecho de importancia do xhtml:
<h:outputLabel value="Estado" for="estado" />
<h:selectOneMenu id="estados"
value="#{usuarioBean.idEstadoSelecionado}">
<f:selectItem itemValue="" itemLabel="Selecione" />
<f:selectItems value="#{usuarioBean.estados}" />
<f:ajax execute="@this" render="cidades" />
</h:selectOneMenu>
<h:outputLabel value="Cidade" for="cidade" />
<h:selectOneMenu id="cidades" value="#{usuarioBean.cidade}">
<f:selectItems value="#{usuarioBean.cidades}" var="c"
itemValue="#{c}" itemLabel="#{c.nome}" />
</h:selectOneMenu>
agora o meu CidadeConverter:
@FacesConverter(forClass=Cidade.class)
public class CidadeConverter implements Converter {
@Override
public Object getAsObject(FacesContext arg0, UIComponent arg1, String value) {
Integer id = Integer.valueOf(value);
return new CidadeDAO().buscaCidadePorId(id);
}
@Override
public String getAsString(FacesContext arg0, UIComponent arg1, Object value) {
Cidade cidade = (Cidade) value;
return String.valueOf(cidade.getId());
}
}
Observem que no caso do estado eu consigo enviar o valor ao int idEstadoSelecionado, por meio de ajax e também recarregar o vetor de cidades com apenas às equivalentes àquele estado.
Eu queria a principio fazer o mesmo com o idCidadeSelecionada, assim eu poderia montar o objeto por meio do CidadeDAO(). Mas não consegui, então seguindo dicas fiz como mostra o codigo apenas com a cidade , para depois fazer com o estado. Enfim, é isso.