Dados do cliente sendo perdidos ao salvar um bairro por uma dialog do cadastro do cliente

6 respostas
N

Bem, eu tenho um cadastro de cliente com diversos dados, nele tem duas dialogs para cadastrar cep e para cadastrar bairro, que cadastram sem nenhum problema e o dialog fecha ao clicar no botao de cadastro e eh listado como deveria aparecer. O problema é que o cliente perde os valores que estavam nos campos (por exemplo, nome, cpf e tal) e queria saber porque isso esta acontecendo e como resolver : p. Vou colocar primeiro o codigo completo, depois as partes relevantes (que acho que sao pelo menos):

XHTML:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html
	xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:p="http://primefaces.org/ui">

<h:head></h:head>

<h:body>

	<ui:composition template="/layout.xhtml">
		<ui:define name="conteudo">
			<h:form styleClass="jsfcrud_list_form">
				<h:panelGroup
					id="messagePanel"
					layout="block">
					<h:messages
						errorStyle="color: red"
						infoStyle="color: green"
						layout="table" />
				</h:panelGroup>

				<h:panelGrid columns="2">
					<h:column>
						<!-- INICIO DOS DADOS BÁSICOS -->
						<p:panel
							id="dadosBase"
							header="Dados Básicos">
							<h:panelGrid
								columns="2"
								style="height: 300px; ">
								<h:outputLabel value="Nome" />
								<p:inputText
									id="nome"
									value="#{controleCliente.cliente.nome}" />
								<h:outputLabel value="Código Interno" />
								<p:inputText
									id="codigo_interno"
									value="#{controleCliente.cliente.codigo_interno}" />
								<h:outputLabel value="Sexo" />
								<h:selectOneRadio
									id="sexo"
									value="#{controleCliente.cliente.sexo}">
									<f:selectItem
										itemLabel="Masculino"
										itemValue="M" />
									<f:selectItem
										itemLabel="Feminino"
										itemValue="F" />
								</h:selectOneRadio>
								<h:outputLabel value="Tipo do Cliente" />
								<h:selectOneRadio
									id="tipo_cliente"
									value="#{controleCliente.cliente.tipo_cliente}"
									title="Selecione qual item deseja inserir CNPJ ou CPF.">
									<f:selectItem
										itemLabel="Fisico"
										itemValue="F" />
									<f:selectItem
										itemLabel="Jurídico"
										itemValue="J" />
									<p:ajax
										update="cpf_cnpj"
										event="change" />
								</h:selectOneRadio>

								<h:outputLabel value="CPF/CNPJ:" />
								<p:inputMask
									id="cpf_cnpj"
									value="#{controleCliente.cliente.cpf_cnpj}"
									size="20"
									mask="#{controleCliente.mascaraCpfCnpj}"
									title="CNPJ se houver." />

								<h:outputLabel value="RG:" />
								<p:inputMask
									id="rg"
									value="#{controleCliente.cliente.rg}"
									mask="9999999999999" />

								<h:outputLabel value="Data de Nascimento:" />
								<p:inputMask
									id="data_nascimento"
									value="#{controleCliente.cliente.data_nascimento}"
									mask="99/99/9999">
									<f:convertDateTime pattern="dd/MM/yyyy" />
								</p:inputMask>

								<h:outputLabel value="Telefone Fixo:" />
								<p:inputMask
									id="fixo"
									value="#{controleCliente.cliente.telefone_fixo}"
									mask="([telefone removido]" />
								<h:outputLabel value="Celular:" />
								<p:inputMask
									id="celular"
									value="#{controleCliente.cliente.celular}"
									mask="([telefone removido]" />
								<h:outputLabel value="Email" />
								<p:inputText
									id="email"
									value="#{controleCliente.cliente.email}" />

							</h:panelGrid>
						</p:panel>
						<!-- FIM DOS DADOS BASICOS -->
					</h:column>
					<h:column>

						<!-- INICIO DO ENDERECO -->
						<p:panel
							id="cadastro"
							header="Endereço">
							<h:panelGrid
								columns="2"
								style="height: 300px; ">

								<h:outputLabel value="Estado" />
								<p:selectOneMenu
									converter="estadoConverter"
									id="estado"
									value="#{controleMunicipio.municipio.estado}">
									<f:selectItems
										value="#{controleEstado.listaTodosEstadosSelecao}"
										var="estado"
										itemLabel="#{estado.sigla}"
										itemValue="#{estado}" />
									<p:ajax update="municipio" />
								</p:selectOneMenu>

								<h:outputLabel value="Municipio" />
								<h:selectOneMenu
									id="municipio"
									value="#{controleBairro.bairro.municipio}"
									converter="municipioConverter">
									<f:selectItems
										value="#{controleMunicipio.listaMunicipiosSelecao}"
										var="municipio"
										itemLabel="#{municipio.dsc}"
										itemValue="#{municipio}" />
									<p:ajax update="bairro" />
								</h:selectOneMenu>
								<h:outputLabel value="Bairro" />
								<h:panelGrid columns="2">
									<h:selectOneMenu
										id="bairro"
										value="#{controleCliente.cliente.bairro}"
										converter="bairroConverter">
										<f:selectItems
											value="#{controleBairro.listaBairrosSelecao}"
											var="bairro"
											itemLabel="#{bairro.dsc}"
											itemValue="#{bairro}" />
									</h:selectOneMenu>
									<p:commandButton
										id="basic"
										value="Novo"
										onclick="dlg1.show();"
										type="button" />
								</h:panelGrid>
								<h:outputLabel value="CEP" />
								<p:inputMask
									id="cep"
									value="#{controleCep.cep.dsc}"
									mask="99999-999">
									<p:ajax update="logradouro" />
								</p:inputMask>
								<h:outputLabel value="Logradouro" />
								<h:panelGrid columns="2">
									<h:selectOneMenu
										id="logradouro"
										value="#{controleCliente.cliente.cep}"
										converter="cepConverter">
										<f:selectItems
											value="#{controleCep.listaCepSelecao}"
											var="cep"
											itemLabel="#{cep.logradouro}"
											itemValue="#{cep}" />
									</h:selectOneMenu>
									<p:commandButton
										id="basic2"
										value="Novo"
										onclick="dlg2.show();"
										type="button" />
								</h:panelGrid>
								<h:outputLabel value="Número" />
								<p:inputText
									id="numero"
									value="#{controleCliente.cliente.numero}" />
								<h:outputLabel value="Complemento" />
								<p:inputText
									id="complemento"
									value="#{controleCliente.cliente.complemento}" />
							</h:panelGrid>
						</p:panel>
						<!-- FIM DO ENDERECO -->
					</h:column>
					<h:column>
						<!-- INICIO DAS INFORMAÇÕES EXTRAS -->
						<p:panel
							id="extras"
							header="Informações Adicionais">
							<h:panelGrid
								columns="2"
								style="height: 210px; ">
								<h:outputLabel value="Pontuação" />
								<p:inputText
									disabled="true"
									id="pontuacao"
									value="#{controleCliente.cliente.pontuacao}" />
								<h:outputLabel value="Observação" />
								<p:inputTextarea
									id="observacao"
									value="#{controleCliente.cliente.observacao}" />
								<h:outputLabel value="Crédito no Serasa" />
								<h:selectBooleanCheckbox
									id="situacao_credito_serasa"
									value="#{controleCliente.cliente.situacao_credito_serasa}" />
								<h:outputLabel value="Data de consulta do Serasa" />
								<p:inputMask
									id="data_consulta_serasa"
									value="#{controleCliente.cliente.data_consulta_serasa}"
									mask="99/99/9999">
									<f:convertDateTime pattern="dd/MM/yyyy" />
								</p:inputMask>
								<h:outputLabel value="Crédito no SPC" />
								<h:selectBooleanCheckbox
									id="situacao_credito_spc"
									value="#{controleCliente.cliente.situacao_credito_spc}" />
								<h:outputLabel value="Data de consulta do SPC" />
								<p:inputMask
									id="data_consulta_spc"
									value="#{controleCliente.cliente.data_consulta_spc}"
									mask="99/99/9999">
									<f:convertDateTime pattern="dd/MM/yyyy" />
								</p:inputMask>
							</h:panelGrid>
						</p:panel>

						<!-- FIM DAS INFORMAÇÕES EXTRAS -->
					</h:column>

					<h:column>
						<!-- INICIO DO CADASTRO -->
						<p:panel
							id="endereco"
							header="Informações de Cadastro">
							<h:panelGrid
								columns="2"
								style="height: 210px; ">
								<h:outputLabel value="Cliente que Indicou (código)" />
								<p:inputText
									disabled="#{controleCliente.cliente.alterar}"
									id="codigo_interno_indicador"
									value="#{controleCliente.cliente.cliente_indicador.codigo_interno}" />

								<h:outputLabel value="Desativado?" />
								<h:selectBooleanCheckbox
									id="desativado"
									value="#{controleCliente.cliente.desativado}" />

								<h:outputLabel value="Data de Desativação:" />
								<p:inputMask
									disabled="true"
									id="data_desativacao"
									value="#{controleCliente.cliente.data_desativacao}"
									mask="99/99/9999">
									<f:convertDateTime pattern="dd/MM/yyyy" />
								</p:inputMask>

								<h:outputLabel value="Data da última alteração:" />
								<p:inputMask
									disabled="true"
									id="data_alteracao"
									value="#{controleCliente.cliente.data_alteracao}"
									mask="99/99/9999">
									<f:convertDateTime pattern="dd/MM/yyyy" />
								</p:inputMask>

								<h:outputLabel value="Data de Cadastro:" />
								<p:inputMask
									disabled="true"
									id="data_cadastro"
									value="#{controleCliente.cliente.data_cadastro}"
									mask="99/99/9999">
									<f:convertDateTime pattern="dd/MM/yyyy" />
								</p:inputMask>

								<h:outputLabel value="Empresa de Cadastro" />
								<p:selectOneMenu
									disabled="#{controleCliente.cliente.alterar}"
									converter="empresaConverter"
									id="empresa"
									value="#{controleCliente.cliente.empresa_cadastro}">
									<f:selectItems
										value="#{controleEmpresa.listaTodasEmpresasSelecao}"
										var="empresa"
										itemLabel="#{empresa.razao_social}"
										itemValue="#{empresa}" />
								</p:selectOneMenu>

							</h:panelGrid>
						</p:panel>
						<!-- FIM DO CADASTRO -->
					</h:column>
				</h:panelGrid>
				<br />
				<p:commandButton
					action="#{controleCliente.salvar}"
					ajax="false"
					value="Cadastrar" />
			</h:form>
			<!-- Popup Cadastro Rua e Bairro (Tem que ficar fora do form para funcionar) -->
			<p:dialog
				id="basicDialog"
				header="Novo Bairro"
				widgetVar="dlg1">
				<ui:include
					src="#{controle.servidor}/bairro/CadastroBairroPnl.xhtml"></ui:include>
			</p:dialog>
			<p:dialog
				id="basicDialog2"
				header="Novo Logradouro"
				widgetVar="dlg2">
				<ui:include src="#{controleGeral.servidor}/cep/CadastroCepPnl.xhtml"></ui:include>
			</p:dialog>
			<!-- Fim dos Popups -->
		</ui:define>
	</ui:composition>
</h:body>
</html>

Agora somente as partes dos popups, botoes e dialogs (esta no outro, mas so para ficar mais facil de ver):

<h:outputLabel value="Municipio" />
								<h:selectOneMenu
									id="municipio"
									value="#{controleBairro.bairro.municipio}"
									converter="municipioConverter">
									<f:selectItems
										value="#{controleMunicipio.listaMunicipiosSelecao}"
										var="municipio"
										itemLabel="#{municipio.dsc}"
										itemValue="#{municipio}" />
									<p:ajax update="bairro" />
								</h:selectOneMenu>
								<h:outputLabel value="Bairro" />
								<h:panelGrid columns="2">
									<h:selectOneMenu
										id="bairro"
										value="#{controleCliente.cliente.bairro}"
										converter="bairroConverter">
										<f:selectItems
											value="#{controleBairro.listaBairrosSelecao}"
											var="bairro"
											itemLabel="#{bairro.dsc}"
											itemValue="#{bairro}" />
									</h:selectOneMenu>
									<p:commandButton
										id="basic"
										value="Novo"
										onclick="dlg1.show();"
										type="button" />
								</h:panelGrid>
...
								<h:outputLabel value="CEP" />
								<p:inputMask
									id="cep"
									value="#{controleCep.cep.dsc}"
									mask="99999-999">
									<p:ajax update="logradouro" />
								</p:inputMask>
								<h:outputLabel value="Logradouro" />
								<h:panelGrid columns="2">
									<h:selectOneMenu
										id="logradouro"
										value="#{controleCliente.cliente.cep}"
										converter="cepConverter">
										<f:selectItems
											value="#{controleCep.listaCepSelecao}"
											var="cep"
											itemLabel="#{cep.logradouro}"
											itemValue="#{cep}" />
									</h:selectOneMenu>
									<p:commandButton
										id="basic2"
										value="Novo"
										onclick="dlg2.show();"
										type="button" />
...
			<p:dialog
				id="basicDialog"
				header="Novo Bairro"
				widgetVar="dlg1">
				<ui:include
					src="#{controle.servidor}/bairro/CadastroBairroPnl.xhtml"></ui:include>
			</p:dialog>
			<p:dialog
				id="basicDialog2"
				header="Novo Logradouro"
				widgetVar="dlg2">
				<ui:include src="#{controleGeral.servidor}/cep/CadastroCepPnl.xhtml"></ui:include>
			</p:dialog>

O xhtml do CadastroBairroPnl.xhtml

<html
	xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:p="http://primefaces.org/ui">
<h:panelGroup
	id="messagePanel"
	layout="block">
	<h:messages
		errorStyle="color: red"
		infoStyle="color: green"
		layout="table" />
</h:panelGroup>

<h:form styleClass="jsfcrud_list_form">
	<p:panel
		header="Cadastro"
		style="margin-bottom:10px;border-top-color: #b2d5d6;">
		<h:panelGrid columns="2">
			<h:outputLabel value="Bairro" />
			<p:inputText
				id="dsc"
				value="#{controleBairro.bairro.dsc}"
				size="20">
			</p:inputText>

			<h:outputLabel value="Estado" />
			<p:selectOneMenu
				converter="estadoConverter"
				id="estado"
				value="#{controleMunicipio.municipio.estado}">
				<f:selectItems
					value="#{controleEstado.listaTodosEstadosSelecao}"
					var="estado"
					itemLabel="#{estado.sigla}"
					itemValue="#{estado}" />
				<p:ajax update="municipio" />
			</p:selectOneMenu>

			<h:outputLabel value="Municipio" />
			<h:selectOneMenu
				id="municipio"
				value="#{controleBairro.bairro.municipio}"
				converter="municipioConverter">
				<f:selectItems
					value="#{controleMunicipio.listaMunicipiosSelecao}"
					var="municipio"
					itemLabel="#{municipio.dsc}"
					itemValue="#{municipio}" />
			</h:selectOneMenu>
			<br />
			<p:commandButton
				action="#{controleBairro.salvar}"
				value="Cadastrar"
				ajax="false" />
		</h:panelGrid>
	</p:panel>
</h:form>
</html>

O código do salvar do bairro (Ná pagina normal dele, ele cadastra normalmente e redireciona para a página de busca sem problemas.)

public String salvar() {
		jpa.salvar(bairro);

		listaBairro = jpa.buscarPorExemplo(bairro);
		limpaDadosBean();

		return "BuscaBairro.xhtml";
	}

Então, alguma ideia do que está acontecendo? (Espero que tenha ficado claro a minha dúvida, qualquer coisa, so perguntar ^^ )

EDIT:

ControleBairro

package main.java.helloworld;

import g4flex.entidades.Bairro;
import g4flex.entidades.Municipio;
import g4flexattendant.servico.contrato.RepositorioJPA;

import java.util.Date;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class ControleBairro extends Controle {
	RepositorioJPA<Bairro> jpa = new RepositorioJPA<Bairro>();
	Bairro bairro = new Bairro();

	public List<Bairro> listaBairro = new ArrayList<Bairro>();

	/**
	 * Método chamado para limpar os dados contidos no Bean antes de cadastrar
	 * um novo objeto
	 * */
	public String preparaCadastrar() {
		limpaDadosBean();
		return "/bairro/CadastroBairro.jsf";
	}

	/**
	 * Método chamado para limpar os dados contidos no Bean antes de chamar a
	 * página de busca pelo menu
	 * */
	public String preparaBusca() {
		limpaDadosBean();
		return "/bairro/BuscaBairro.jsf";
	}

	public String preparaAlterar() {
		bairro.setAlterar(true);
		return "/bairro/CadastroBairro.jsf";
	}

	public void limpaDadosBean() {
		bairro = new Bairro();
		bairro.setMunicipio(new Municipio());
		bairro.setAlterar(false);
	}

	public String salvar() {
		jpa.salvar(bairro);

		listaBairro = jpa.buscarPorExemplo(bairro);
		limpaDadosBean();

		return "BuscaBairro.xhtml";
	}

	public String excluir() {
		jpa.excluir(bairro);

		//limpaDadosBean();
		//listarEntidades();

		return "BuscaBairro.xhtml";
	}

	public String listarEntidades() {
		listaBairro = jpa.buscarPorCampos(bairro);
		return "BuscaBairro.xhtml";
	}

	public List<Bairro> getListaBairrosSelecao() {
		listaBairro = new ArrayList<Bairro>();
		listaBairro.add(new Bairro(-1, "SELECIONE"));
		if (bairro.getMunicipio() != null
				&& bairro.getMunicipio().getId() != null) {
			List<Bairro> buscarPorCampos = jpa.buscarPorCampos(bairro);
			if (buscarPorCampos != null && buscarPorCampos.size() > 0) {
				listaBairro.addAll(buscarPorCampos);
			}
		}
		return listaBairro;
	}

	public List<Bairro> getListaBairro() {
		return listaBairro;
	}

	public Bairro getBairro() {
		return bairro;
	}

	public void setBairro(Bairro Bairro) {
		this.bairro = Bairro;
	}
}

e ControleCliente

package main.java.helloworld;

import g4flex.entidades.Bairro;
import g4flex.entidades.Cep;
import g4flex.entidades.Cliente;
import g4flex.entidades.Empresa;
import g4flexattendant.servico.contrato.RepositorioJPA;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class ControleCliente extends Controle{
	RepositorioJPA<Cliente> jpa = new RepositorioJPA<Cliente>();
	Cliente cliente = new Cliente();

	public List<Cliente> listaCliente = new ArrayList<Cliente>();

	/**
	 * Método chamado para limpar os dados contidos no Bean antes de cadastrar
	 * um novo objeto
	 * */
	public String preparaCadastrar() {
		limpaDadosBean();
		cliente.setData_cadastro(new Date());
		return "/cliente/CadastroCliente.jsf";
	}

	/**
	 * Método chamado para limpar os dados contidos no Bean antes de chamar a
	 * página de busca pelo menu
	 * */
	public String preparaBusca() {
		limpaDadosBean();
		listaCliente = new ArrayList<Cliente>();
		return "/cliente/BuscaCliente.jsf";
	}

	public String preparaAlterar() {
		cliente.setAlterar(true);
		cliente.setData_alteracao(new Date());
		// TODO: Recuperar pedido se necessário
		return "/cliente/CadastroCliente.jsf";
	}

	public void limpaDadosBean() {
		cliente = new Cliente();
		cliente.setAlterar(false);
		cliente.setBairro(new Bairro());
		cliente.setCep(new Cep());
		cliente.setCliente_indicador(new Cliente());
		cliente.setEmpresa_cadastro(new Empresa());
	}

	public String salvar() {
		// Se o cliente estiver sendo cadastrado agora nao tera data de cadastro
		if (cliente.getData_cadastro() == null) {
			cliente.setData_cadastro(new Date());
			// cliente.setAtivo(true);
		}
		// Busca no banco pelo código interno do cliente
		if (cliente.getCliente_indicador().getCodigo_interno() != null
				|| !cliente.getCliente_indicador().getCodigo_interno().trim()
						.equals("")) {
			List<Cliente> listaClienteInd = jpa.buscarPorExemplo(cliente
					.getCliente_indicador());
			if (listaClienteInd != null && listaClienteInd.size() > 0) {
				cliente.setCliente_indicador(listaClienteInd.get(0));
			} else {

				// TODO: tratar cliente não encontrado

			}
		}
		// Se cliente for desativado e não tiver data de desativação, será
		// setada como a atual
		if (cliente.isDesativado() && cliente.getData_desativacao() == null) {
			cliente.setData_desativacao(new Date());
		}
		// Se o cliente estiver ativo e tiver data de desativação, a mesma será
		// setada como nula
		if (!cliente.isDesativado() && cliente.getData_desativacao() != null) {
			cliente.setData_desativacao(null);
		}
		jpa.salvar(cliente);

		listaCliente = jpa.buscarPorExemplo(cliente);
		limpaDadosBean();

		return "BuscaCliente.xhtml";
	}

	public String excluir() {
		jpa.excluir(cliente);

		//limpaDadosBean();
		//listarClientes();

		return "BuscaCliente.xhtml";
	}

	/**
	 * Método para retornar a máscara de CPF ou CNPJ de acordo com o tipo do
	 * cliente (se não houver tipo de cliente ainda, retorna a máscara de CPF)
	 * 
	 * @author Mateus Carmo
	 * */
	public String getMascaraCpfCnpj() {
		if (cliente.getTipo_cliente() != null) {
			return cliente.getTipo_cliente().equals('F') ? "[CPF removido]"
					: "99.999.999/9999-99";
		} else {
			return "[CPF removido]";
		}
	}

	public String listarEntidades() {
		listaCliente = jpa.buscarPorCampos(cliente);
		return "BuscaCliente.xhtml";
	}

	public List<Cliente> getListaCliente() {
		return listaCliente;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente Cliente) {
		this.cliente = Cliente;
	}
}

6 Respostas

drsmachado

Qual o escopo do managedbean?

N

tanto o ControleCliente como o ControleBairro sao SessionScoped

drsmachado

Talvez por isso

limpaDadosBean();
N

Esse metodo limpa apenas os dados do bairro, no controleBairro, perai q vo adicionar ambas ControleCliente e ControleBairro tambem la pra ajudar

N

Pronto, postei ambas as classes ^^

N

Bem, so para avisar caso alguem venha a ter um problema parecido, consegui resolver colocando <p:ajax> nos campos para salvar os dados, por exemplo:

<p:inputText
    id="nome"
    required="true"
    requiredMessage="Campo Obrigatório: Nome"
    value="#{controleCliente.cliente.nome}">
	<p:ajax />
</p:inputText>
Criado 9 de julho de 2013
Ultima resposta 17 de jul. de 2013
Respostas 6
Participantes 2