Bem, estou com mais um problema com componentes PrimeFaces e requisição ajax.
O cenário é bem conhecido…Toda vez que eu seleciono um estado, o sistema executa um método e carrega as cidades do estado em um componente de seleção.
O problema é o seguinte…se eu tentar gravar os dados do formulário e algum erro de validação acontecer, como por exemplo: “Informe o número do documento”, sempre que eu altero o estado, o método definido no ajax não dispara e o componente de cidade some da tela… oc que pode estar acontecendo? Requisições ajax são muito importantes para o desenvolvimento do meu sistema…
Tela:
<ui:composition template="/template/admintemplate.xhtml">
<ui:define name="conteudo">
<p:panel header="Cadastro de Administrador">
<h:outputScript library="scripts" name="somentenumeros.js" />
<h:form id="cadastro">
<h:inputHidden id="adminid" value="#{adminBean.administrador.id}"/>
<h:inputHidden id="pessoaid" value="#{adminBean.administrador.pessoa.id}"/>
<p:messages id="mensagens" showDetail="false" autoUpdate="true" closable="true"/>
<h:panelGrid columns="2">
<h:outputLabel value="Documento *" for="documento"/>
<p:inputText id="documento" value="#{adminBean.administrador.pessoa.documento}"
size="14" maxlength="14" required="true" requiredMessage="Informe o número do documento"
onkeypress="return somenteNumero(event);">
<f:validator validatorId="documentoValidator"/>
<p:ajax event="change" update="pessoaid, nome, logradouro, numero, complemento, bairro, pngestado,
pngcidade, cep, telefone1, telefone2, email"
listener="#{adminBean.carregarDadosPessoa}"></p:ajax>
</p:inputText>
<h:outputLabel value="Nome *" for="nome"/>
<p:inputText id="nome" value="#{adminBean.administrador.pessoa.nome}"
size="100" maxlength="100" required="true" requiredMessage="Informe o nome">
</p:inputText>
<h:outputLabel value="Logradouro *" for="logradouro"/>
<p:inputText id="logradouro" value="#{adminBean.administrador.pessoa.logradouro}"
size="100" maxlength="100" required="true" requiredMessage="Informe o logradouro">
</p:inputText>
<h:outputLabel value="Número" for="numero"/>
<p:inputText id="numero" value="#{adminBean.administrador.pessoa.numero}"
size="20" maxlength="20" required="false">
</p:inputText>
<h:outputLabel value="Complemento" for="complemento"/>
<p:inputText id="complemento" value="#{adminBean.administrador.pessoa.complemento}"
size="20" maxlength="20" required="false">
</p:inputText>
<h:outputLabel value="Estado *" for="estado"/>
<h:panelGroup id="pngestado">
<p:selectOneMenu id="estado"
value="#{adminBean.estadoSelecionado}"
converter="estadoConverter"
effect="fade" style="width:160px"
required="true" requiredMessage="Selecione um estado">
<f:selectItem itemLabel="Selecione um estado" itemValue="" />
<f:selectItems value="#{adminBean.estadosCadastrados}" var="estado"
itemLabel="#{estado.nome}" itemValue="#{estado}"/>
<p:ajax event="change" listener="#{adminBean.carregarCidades}" update="pngcidade"/>
</p:selectOneMenu>
</h:panelGroup>
<h:outputLabel value="Cidade *" for="cidade"/>
<h:panelGroup id="pngcidade">
<p:selectOneMenu id="cidade"
value="#{adminBean.cidadeSelecionada}"
converter="cidadeConverter"
effect="fade" style="width:160px"
required="true" requiredMessage="Selecione uma cidade">
<f:selectItem itemLabel="Selecione uma cidade" itemValue="" />
<f:selectItems value="#{adminBean.cidades}" var="cidade" itemLabel="#{cidade.nome}" itemValue="#{cidade}"/>
</p:selectOneMenu>
</h:panelGroup>
<h:outputLabel value="Bairro *" for="bairro"/>
<p:inputText id="bairro" value="#{adminBean.administrador.pessoa.bairro}"
size="50" maxlength="50" required="true" requiredMessage="Informe o bairro">
</p:inputText>
<h:outputLabel value="CEP" for="cep"/>
<p:inputMask id="cep" value="#{adminBean.administrador.pessoa.cep}"
mask="99999-999" converter="cepConverter"
validatorMessage="Informe um CEP válido">
</p:inputMask>
<h:outputLabel value="Telefone 1" for="telefone1"/>
<p:inputMask id="telefone1" value="#{adminBean.administrador.pessoa.telefone1}"
mask="(99)9999-9999"
converter="telefoneConverter"
validatorMessage="Telefone 1 inválido">
</p:inputMask>
<h:outputLabel value="Telefone 2" for="telefone2"/>
<p:inputMask id="telefone2" value="#{adminBean.administrador.pessoa.telefone2}"
mask="(99)9999-9999"
converter="telefoneConverter"
validatorMessage="Telefone 2 inválido">
</p:inputMask>
<h:outputLabel value="Email *" for="email"/>
<p:inputText id="email" value="#{adminBean.administrador.pessoa.email}"
maxlength="100" size="100"
required="true" requiredMessage="Informe o email"
validatorMessage="Informe um email válido">
</p:inputText>
<p:commandButton action="#{adminBean.salvar}" value="Salvar" ajax="false" icon="ui-icon-check" style="margin:0"/>
</h:panelGrid>
</h:form>
</p:panel>
</ui:define>
</ui:composition>
ManagedBean:
package skymedic.administrador;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import sistemasas.administrador.Administrador;
import sistemasas.administrador.AdministradorBusiness;
import sistemasas.endereco.Cidade;
import sistemasas.endereco.Estado;
import sistemasas.endereco.ICidadeDAO;
import sistemasas.endereco.IEstadoDAO;
import sistemasas.pessoa.IPessoaDAO;
import sistemasas.pessoa.Pessoa;
import skymedic.endereco.EnderecoFactory;
import skymedic.pessoa.PessoaFactory;
import skymedic.utils.ExibeMensagem;
@ManagedBean(name="adminBean")
@ViewScoped
public class AdministradorBean {
private final String PAGINA_ADMIN_CADASTRO = "admincadastro";
private final String PAGINA_ADMIN_EDICAO = "/admin/admincadastro?faces-redirect=true&includeViewParams=true";
private final String PAGINA_ADMIN_LISTA = "adminlista";
private Administrador administrador;
private List<Administrador> administradores;
private List<Administrador> administradoresConsultados;
private List<Estado> estadosCadastrados;
private Estado estadoSelecionado;
private List<Cidade> cidades;
private Cidade cidadeSelecionada;
@PostConstruct
private void iniciarAdministradorBean() {
this.administrador = AdministradorFactory.criarAdministrador();
this.administrador.setPessoa(PessoaFactory.criarPessoa());
this.administradores = null;
this.administradoresConsultados = null;
this.estadosCadastrados = null;
this.estadoSelecionado = null;
this.cidades = null;
this.cidadeSelecionada = null;
}
public Administrador getAdministrador() {
return administrador;
}
public void setAdministrador(Administrador administrador) {
this.administrador = administrador;
configurarEstadoECidadeSelecionado();
}
public void configurarEstadoECidadeSelecionado() {
if (administradorPossuiEstado()) {
this.estadoSelecionado = this.administrador.getPessoa().getEstado();
carregarCidades();
if (administradorPossuiCidade()) {
this.cidadeSelecionada = this.administrador.getPessoa().getCidade();
}
}
}
public List<Administrador> getAdministradoresConsultados() {
return administradoresConsultados;
}
public void setAdministradoresConsultados(List<Administrador> administradoresConsultados) {
this.administradoresConsultados = administradoresConsultados;
}
public List<Estado> getEstadosCadastrados() {
if (this.estadosCadastrados == null) {
IEstadoDAO estadoDAO = EnderecoFactory.criarEstadoDAO();
this.estadosCadastrados = estadoDAO.listar();
}
return estadosCadastrados;
}
public Estado getEstadoSelecionado() {
if (administradorPossuiEstado()) {
this.estadoSelecionado = this.administrador.getPessoa().getEstado();
}
return estadoSelecionado;
}
private boolean administradorPossuiEstado() {
return (this.administrador.getPessoa().getEstado() != null);
}
public void setEstadoSelecionado(Estado estadoSelecionado) {
this.estadoSelecionado = estadoSelecionado;
}
public Cidade getCidadeSelecionada() {
if (administradorPossuiCidade()) {
this.cidadeSelecionada = this.administrador.getPessoa().getCidade();
}
return cidadeSelecionada;
}
public boolean administradorPossuiCidade() {
return (this.administrador.getPessoa().getCidade() != null);
}
public void setCidadeSelecionada(Cidade cidadeSelecionada) {
this.cidadeSelecionada = cidadeSelecionada;
}
public List<Cidade> getCidades() {
if (this.cidades == null) {
carregarCidades();
}
return this.cidades;
}
public List<Administrador> getListagem() {
if (this.administradores == null) {
AdministradorBusiness business = AdministradorFactory.criarAdministradorBusiness();
this.administradores = business.listar();
}
return this.administradores;
}
public String novo() {
return PAGINA_ADMIN_CADASTRO;
}
public String editar() {
return PAGINA_ADMIN_EDICAO;
}
public String salvar() {
try {
this.administrador.getPessoa().setEstado(this.estadoSelecionado);
this.administrador.getPessoa().setCidade(this.cidadeSelecionada);
AdministradorBusiness business = AdministradorFactory.criarAdministradorBusiness();
business.salvar(this.administrador);
iniciarAdministradorBean();
ExibeMensagem.exibirMensagemOK("Administrador gravado com sucesso");
return PAGINA_ADMIN_LISTA;
} catch(Exception e) {
ExibeMensagem.exibirMensagemErro(e.getMessage().split(System.getProperty("line.separator")));
}
return null;
}
public String excluir() {
try {
AdministradorBusiness business = AdministradorFactory.criarAdministradorBusiness();
business.excluir(this.administrador);
iniciarAdministradorBean();
ExibeMensagem.exibirMensagemOK("Administrador excluido com sucesso");
return PAGINA_ADMIN_LISTA;
} catch(Exception e) {
ExibeMensagem.exibirMensagemErro(e.getMessage().split(System.getProperty("line.separator")));
}
return null;
}
public void carregarDadosPessoa() {
String documento = this.administrador.getPessoa().getDocumento();
this.estadoSelecionado = null;
this.cidadeSelecionada = null;
Pessoa pessoa = retornarPessoa(documento);
if (pessoa != null) {
this.administrador.setPessoa(pessoa);
this.estadoSelecionado = pessoa.getEstado();
this.cidadeSelecionada = pessoa.getCidade();
} else {
iniciarAdministradorBean();
}
carregarCidades();
}
private Pessoa retornarPessoa(String documento) {
if (documento != null && ! "".equals(documento)) {
IPessoaDAO pessoaDAO = PessoaFactory.criarPessoaDAO();
return pessoaDAO.buscarPeloDocumento(documento);
}
return null;
}
public void carregarCidades() {
this.cidades = null;
if (this.estadoSelecionado != null) {
ICidadeDAO cidadeDAO = EnderecoFactory.criarCidadeDAO();
this.cidades = cidadeDAO.listar(this.estadoSelecionado);
} else {
this.cidades = new ArrayList<Cidade>();
}
}
}