Problema pesquisar e inserir com Ajax + dialog +datatable (Primefaces 2.2)

Boa tarde! Estou com problemas há mais de semanas com um problema. Já tentei todas as formas possíveis e debugei o projeto várias vezes mas não encontro o motivo.
Bem, Tenho um cadastro de professor. Quando clico no botão para pesquisar um município abre um popup que utilizo o <p:dialog … e dentro dele um <p:datatable … (Tambem ja tentei o <h:datatable)
No caso como tenho alguns municipios já listão eles. Quando clico em adicionar ele fecha o dialog e mostra no campo cidade a descrição.
Mas como nem tudo é maravilha vem os problemas:

  1. Quando clico em inserir ele dá null exception pois só fica a descrição do munícipio (Debugando o projeto simplesmente um momento quando ele entra no método insert desaparece)
  2. Quando digito parte do nome do municipio e clico buscar, realiza a pesquisa com ajax perfeitamente, mas quando clico em adicionar aparece a descrição do outro municipio no campo.
  3. Enfim dúvida cruel que quando clico em alguma ação ou utilizo o debug, ele passa mais de 1 vez nos metodos getters e setters.
    Por favor me dê um luz nisso
    formulario
<!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.prime.com.tr/ui">
<h:head>
	<p:resources />
</h:head>
<h:body>
<style>
	.right{
		width: 150px;
		color: blue;
		float: right;
	}
</style>
<ui:composition template="template.xhtml">
<ui:define name="conteudo">
	<p:messages />
	<h:form prependId="false" id="formprofessor">
	<p:fieldset legend="Informações do professor" >
		<h:panelGrid  border="0" width="100%" columns="4" columnClasses="right,left,right,left">
			<h:outputText value="#{msgs.cpf}" />
			<h:panelGroup>
				<p:inputMask value="#{professorController.professor.cpf}" mask="999.999.999-99" validator="CPFValidator"
							converter="CPFConverter" id="cpf" label="cpf" size="15" alt="cpf" />
				<h:commandLink><h:graphicImage value="imagens/lupa.gif" /></h:commandLink>
			</h:panelGroup>
			<h:outputText value="#{msgs.matricula}" />
			<h:inputText value="#{professorController.professor.matriculaFuncional}" size="21" maxlength="10" />
			<h:outputText value="#{msgs.nome}" />
			<h:inputText value="#{professorController.professor.nomePessoa}" size="46" />
		</h:panelGrid>
		</p:fieldset>		
		<p:fieldset legend="Endereço" >
			<h:panelGrid  border="0" width="100%" columns="4" columnClasses="right,left,right,left">
				<h:outputText value="#{msgs.logradouro}" />
				<h:inputText value="#{professorController.professor.pessoa.endereco.logradouro}" size="46" />
				<h:outputText value="#{msgs.numero}" />
				<h:inputText value="#{professorController.professor.pessoa.endereco.numero}" size="10" />
				<h:outputText value="#{msgs.bairro}" />
				<h:inputText value="#{professorController.professor.pessoa.endereco.bairro}" size="46" />
				<h:outputText value="#{msgs.cep}" />
				<p:inputMask mask="99.999-999" value="#{professorController.professor.pessoa.endereco.cep}" converter="CEPConverter" />
				<h:outputText value="#{msgs.complemento}" />
				<h:inputText value="#{professorController.professor.pessoa.endereco.complemento}" size="46" />
				<h:outputText/>
				<h:outputText/>
				<h:outputText value="#{msgs.municipio}" />
				<h:inputText value="#{professorController.professor.municipio.descricao}" size="46" />
				<p:commandButton value="Pesquisar" onclick="dialogMunicipio.show();" type="button" />											
				<h:outputText/>
			</h:panelGrid>
		</p:fieldset>
		<p:dialog header="Pesquisa por município" widgetVar="dialogMunicipio" modal="true" height="350" width="500" showEffect="bounce">
			<h:panelGrid columns="3">
				<h:outputText value="Município:" />
				<h:inputText size="60" value="#{professorController.qryMunicipio.descricao}" />
				<p:commandButton value="Pesquisar" actionListener="#{professorController.pesquisarMunicipio}" update="tablemunicipio" />
			</h:panelGrid>
			<div id="tabela" style="height:250px; width:99%; border: solid 1px #9AB75F; overflow:auto;">
				<p:dataTable var="obj" id="tablemunicipio"
					value="#{professorController.listaMunicipio}">
					<p:column>
						<f:facet name="header">Município</f:facet>
						<h:outputText value="#{obj.descricao}" />
					</p:column>
					<p:column>
						<f:facet name="header">Estado</f:facet>
						<h:outputText value="#{obj.estado.sigla}" />
					</p:column>
					<p:column>
						<f:facet name="header">Ação</f:facet>
						<p:commandButton update="formprofessor" onclick="dialogMunicipio.hide()" image="ui-icon ui-icon-bookmark" title="Adicionar">
							<f:setPropertyActionListener target="#{professorController.professor.municipio}" value="#{obj}" />
						</p:commandButton>
					</p:column>
				</p:dataTable>
			</div>
			<div id="load" style="display: none"><img
				src="imagens/ajaxloading.gif" />Carregando...</div>
			<p:ajaxStatus
				onstart="document.getElementById('tabela').style.display = 'none',document.getElementById('load').style.display = 'block'"
				oncomplete="document.getElementById('tabela').style.display = 'block',document.getElementById('load').style.display = 'none'"
				style="width:16px;height:16px;">
				<f:facet name="start"><h:outputText value="Carregando..." /></f:facet>
				<f:facet name="complete"><h:outputText value="" /></f:facet>
			</p:ajaxStatus>
		</p:dialog>
		<p:commandButton ajax="false" value="Inserir" action="#{professorController.insert}" disabled="#{professorController.professor.pessoa.idPessoaFisica != null}"/>
		<p:commandButton ajax="false" value="Salvar" action="#{professorController.update}" disabled="#{professorController.professor.pessoa.idPessoaFisica == null}" />
		<p:commandButton ajax="false" value="Limpar" action="#{professorController.clear}" />
	</h:form>
</ui:define>
</ui:composition>
</h:body>
</html>[/code]

Controller

[code]
/**
 * 
 */
package tcc.br.com.controller;

import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.event.ActionEvent;
import javax.faces.validator.ValidatorException;

import tcc.br.com.dao.MunicipioDAO;
import tcc.br.com.dao.ProfessorDAO;
import tcc.br.com.model.Municipio;
import tcc.br.com.model.Professor;
import tcc.br.com.util.ExceptionDatabase;
import tcc.br.com.validator.EnderecoValidator;
import tcc.br.com.validator.ProfessorValidator;

/**
 * @author Lesliê Cardoso da Silva
 * @since  10/11/2010
 *
 */
@ManagedBean(name="professorController")
@RequestScoped
public class ProfessorController extends MessageController {
	private Professor professor;
	private List<Professor> listaProfessor;
	private List<Municipio> listaMunicipio;
	private Municipio qryMunicipio;

	/**
	 * @return the professor
	 */
	public Professor getProfessor() {
		if(professor == null){
			professor = new Professor();
		}
		return professor;
	}
	/**
	 * @param professor the professor to set
	 */
	public void setProfessor(Professor professor) {
		this.professor = professor;
	}
	
	/**
	 * @return the qryMunicipio
	 */
	public Municipio getQryMunicipio() {
		if(qryMunicipio == null){
			qryMunicipio = new Municipio();
		}
		return qryMunicipio;
	}
	/**
	 * @param qryMunicipio the qryMunicipio to set
	 */
	public void setQryMunicipio(Municipio qryMunicipio) {
		this.qryMunicipio = qryMunicipio;
	}
	/**
	 * @return the listaMunicipio
	 */
	public List<Municipio> getListaMunicipio() {
		if(listaMunicipio == null){
			try 
			{
				MunicipioDAO munDAO = new MunicipioDAO();
				listaMunicipio = munDAO.findByMunicipio(getQryMunicipio());
			} 
			catch(ExceptionDatabase e) 
			{
				setErroMessage(e.getMessage());
			}
		}
		return listaMunicipio;
	}
	/**
	 * @param listaMunicipio the listaMunicipio to set
	 */
	public void setListaMunicipio(List<Municipio> listaMunicipio) {
		this.listaMunicipio = listaMunicipio;
	}
	
	/**
	 * @return the listaProfessor
	 */
	public List<Professor> getListaProfessor() {
		if(listaProfessor == null){
			//listaProfessor = new Arr<Professor>();
		}
		return listaProfessor;
	}
	/**
	 * @param listaProfessor the listaProfessor to set
	 */
	public void setListaProfessor(List<Professor> listaProfessor) {
		this.listaProfessor = listaProfessor;
	}
	
	/**
	 * Função para inserir professor
	 * @return void
	 */
	public void insert() throws ExceptionDatabase{
        ProfessorDAO pDAO = new ProfessorDAO();

        try
        {
        	//Validação da classe professor
        	ProfessorValidator pV = new ProfessorValidator();
        	pV.validate(null, null,getProfessor());
        	
        	//Validação da classe endereço caso um desses campos estiver preenchidos
        	if(!getProfessor().getPessoa().getEndereco().getLogradouro().equals("")
        	|| !getProfessor().getPessoa().getEndereco().getNumero().equals("")
        	|| !getProfessor().getPessoa().getEndereco().getBairro().equals("")
        	|| !getProfessor().getPessoa().getEndereco().getCep().equals("")
        	|| !getProfessor().getPessoa().getEndereco().getComplemento().equals("")
        	|| !getProfessor().getPessoa().getEndereco().getMunicipio().equals(""))
        	{
        		EnderecoValidator endV = new EnderecoValidator();
        		endV.validate(null,null,getProfessor().getPessoa().getEndereco());
        		getProfessor().getPessoa().setMunicipio(getProfessor().getMunicipio());
        	}

            pDAO.insert(getProfessor());
            setProfessor(null);
            setInfoMessage("Professor(a) inserido(a) com sucesso!");
        }
        catch(ExceptionDatabase e)
        {
            setErroMessage(e.getMessage());
        }
        catch(ValidatorException e)
        {
            setErroMessage(e.getMessage());
        }
	}
	
	/**
	 * Função que limpa a lista do popup para efetuar nova busca utilizando AJAX
	 * 
	 * @author Lesliê Cardoso da Silva
	 * @since  13/11/2010
	 *
	 * @param actionEvent
	 */
	public void pesquisarMunicipio(ActionEvent actionEvent) {   
        setListaMunicipio(null);
	}
	
	/**
	 * 
	 * 
	 * @author Lesliê Cardoso da Silva
	 * @since  13/11/2010
	 *
	 */
	public void clear(){
		setProfessor(null);
	}
	
}
[/code]

DAO do Professor

[code]package tcc.br.com.dao;

import java.sql.PreparedStatement;
import java.sql.SQLException;

import tcc.br.com.model.PessoaFisica;
import tcc.br.com.model.Professor;
import tcc.br.com.util.Conexao;
import tcc.br.com.util.ExceptionDatabase;

/**
 * @author Lesliê Cardoso da Silva
 * @since  10/11/2010
 *
 */
public class ProfessorDAO extends DAO{
	private PessoaFisica pessoa;
	private Professor professor;
	

	/**
	 * @return the professor
	 */
	public Professor getProfessor() {
		if(professor == null){
			professor = new Professor();
		}
		return professor;
	}

	/**
	 * @param professor the professor to set
	 */
	public void setProfessor(Professor professor) {
		this.professor = professor;
	}

	/**
	 * @return the pessoa
	 */
	public PessoaFisica getPessoa() {
		if(pessoa == null){
			pessoa = new PessoaFisica();
		}
		return pessoa;
	}

	/**
	 * @param pessoa the pessoa to set
	 */
	public void setPessoa(PessoaFisica pessoa) {
		this.pessoa = pessoa;
	}

	/** 
	 * @param Object
	 */
	@Override
	public void insert(Object obj) throws ExceptionDatabase {
        StringBuilder sql = new StringBuilder();
        Conexao con = new Conexao();
        
        sql.append("INSERT INTO tcc.professor(id_pessoa_fisica, nome_pessoa, matricula_funcional,cpf) ");
        sql.append("VALUES (?, ?, ?, ?); ");
        
        Professor pf = (Professor)obj;
        
        try
        {
        	//Seta a abertura de conexao com commit manual
	        con.open(false);
	        
	        PessoaFisicaDAO pfDAO = new PessoaFisicaDAO();
	        
	        //Verifica se existe um professor cadastrado com essa matricula
	        pfDAO.findByMatriculaFuncional(pf.getMatriculaFuncional());
	        
	        //Seta a chave primaria da pessoa fisica
        	pf.setIdPessoaFisica(getIdSequence(con,"tcc.id_pessoa_fisica_seq"));
	        
	        PreparedStatement stmt = con.getPreparedStatement(sql.toString());
	
	        //Insere o professor que automaticamente grava na pessoa fisica atraves da herança na tabela
	        stmt.setInt(1,pf.getIdPessoaFisica());
	        stmt.setString(2,pf.getNomePessoa());
	        stmt.setString(3,pf.getMatriculaFuncional());
	        stmt.setString(4,pf.getCpf());
	        con.executeSQL(stmt);

	        PessoaFisicaEnderecoDAO endDAO = new PessoaFisicaEnderecoDAO();
	        if(!pf.getPessoa().getEndereco().getLogradouro().trim().equals(""))
	        endDAO.insert(con,pf.getPessoa().getEndereco());
	        
	        con.commit();
	    }
	    catch(ExceptionDatabase e)
	    {
	        con.rollBack();
	        throw new ExceptionDatabase("Erro: "+e.getMessage());
	    }
	    catch(SQLException e)
	    {
	        con.rollBack();
	        throw new ExceptionDatabase("Erro: "+e.getMessage());
	    }
	    finally{
	        con.close();
	    }
	}

	/* (non-Javadoc)
	 * @see tcc.br.com.dao.DAO#update(java.lang.Object)
	 */
	@Override
	public void update(Object obj) throws ExceptionDatabase {
		// TODO Auto-generated method stub
		
	}

}

DAO municipio (Onde realizo a busca no popup do municipio)

[code]/**
*
*/
package tcc.br.com.dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import tcc.br.com.model.Municipio;
import tcc.br.com.util.Conexao;
import tcc.br.com.util.ExceptionDatabase;
import tcc.br.com.util.ParseResultSetForObj;

/**

  • @author Lesliê Cardoso da Silva
  • @since 12/11/2010

*/
public class MunicipioDAO {
public List findByMunicipio(Municipio mun) throws ExceptionDatabase{
StringBuffer queryBuffer = new StringBuffer();
queryBuffer.append(" SELECT * FROM tcc.municipio “);
queryBuffer.append(” INNER JOIN tcc.estado ON tcc.municipio.id_estado = tcc.estado.id_estado “);
queryBuffer.append(” WHERE nome_municipio ilike ? ");
Conexao con = new Conexao();

	try 
	{
		con.open();
		
		List<Municipio> listaMunicipio= new ArrayList<Municipio>();
		PreparedStatement stmt = con.getPreparedStatement(queryBuffer);
		
		stmt.setString(1, (mun.getdescricao()==null)?"%%":"%"+mun.getdescricao()+"%");
		ResultSet rs = con.execQuery(stmt);

		ParseResultSetForObj ps = new ParseResultSetForObj();
		while(rs.next()){
			listaMunicipio.add(ps.convertRsForMunicipio(rs, new Municipio()));
		}
		return listaMunicipio;
	} 
	catch(ExceptionDatabase e) 
	{
		throw new ExceptionDatabase(e.getMessage());
	} 
	catch(SQLException e) 
	{
		throw new ExceptionDatabase(e.getMessage());
	}
	finally{
		con.close();
	}		
}

}
[/code]





Cara…

eu não consegui deixar o Dialog ficar na tela, quando eu clico em pesquisar ele fecha o dialog, estou usando a mesma versão do prime faces!

Aconteceu isso com você também!!

Abraço!!

xD~~

[quote=altitdb]Cara…

eu não consegui deixar o Dialog ficar na tela, quando eu clico em pesquisar ele fecha o dialog, estou usando a mesma versão do prime faces!

Aconteceu isso com você também!!

Abraço!!

xD~~[/quote]

Não aparece o dialog, a pesquisa e ajax funciona perfeitamente, o problema que quando clico em algum item depois da busca realizada e clico no item selecionado ele está setando o valor correto no objeto, mas a descrição do campo ele está colocando outra.

Cara…

ontem depois de horas consegui arrumar o meu…

Dá uma olhada na minha view!

<?xml version="1.0" encoding="UTF-8"?>
<!--
To change this template, choose Tools | Templates
and open the template in the editor.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.prime.com.tr/ui"
      xmlns:ui="http://java.sun.com/jsf/facelets">
    <h:head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <title></title>
    </h:head>
    <h:body>

        <f:view>
            <ui:include src="/includes/menu.xhtml"/>
            <p:panel header="Cadastro de Veículo" >
                <h:form id="form" prependId="false">
                    <h:panelGrid id="transportador" columns="3" cellpadding="5" cellspacing="3" dir="LTR" >
                        <h:outputLabel value="Código:" />
                        <h:panelGroup>
                            <h:inputText value="#{veiculoTranspMB.veiculoTransp.idVeiculoTransp}" id="idVeiculoTransp" maxlength="" size="8"/>
                            <h:outputLabel value="Ativo:" style="margin-left: 10px;" />
                            <h:selectBooleanCheckbox value="#{veiculoTranspMB.veiculoTransp.ativo}" id="ativo" />
                        </h:panelGroup>
                        <h:outputText />
                        <h:outputLabel value="Transportador"/>
                        <h:panelGroup>
                            <h:inputText value="#{veiculoTranspMB.veiculoTransp.transportador.xNome}" id="nometransportador" maxlength="" size=""/>
                            <p:commandButton value="Buscar" onclick="modal.show()" type="button" ajax="false"/>
                        </h:panelGroup>
                        <h:outputText/>
                        <h:outputLabel value="Placa:"/>
                        <h:inputText value="#{veiculoTranspMB.veiculoTransp.placa}" id="placa" maxlength="8" size="8"/>
                        <p:message  for="placa" />
                        <h:outputLabel value="UF:"/>
                        <h:panelGroup>
                            <h:selectOneMenu value="#{veiculoTranspMB.veiculoTransp.UF}" id="UF">
                                <f:selectItem itemLabel="Selecione" itemValue="" />
                                <f:selectItem itemLabel="AC" itemValue="AC"/>
                                <f:selectItem itemLabel="SC" itemValue="BA"/>
                                <f:selectItem itemLabel="MG" itemValue="MG"/>
                                <f:selectItem itemLabel="ES" itemValue="ES"/>
                                <f:selectItem itemLabel="RJ" itemValue="RJ"/>
                                <f:selectItem itemLabel="SP" itemValue="SP"/>
                                <f:selectItem itemLabel="PR" itemValue="PR"/>
                                <f:selectItem itemLabel="SC" itemValue="SC"/>
                                <f:selectItem itemLabel="RS" itemValue="RS"/>
                                <f:selectItem itemLabel="MS" itemValue="MS"/>
                                <f:selectItem itemLabel="MT" itemValue="MT"/>
                                <f:selectItem itemLabel="GO" itemValue="GO"/>
                                <f:selectItem itemLabel="DF" itemValue="DF"/>
                                <f:selectItem itemLabel="SE" itemValue="SE"/>
                                <f:selectItem itemLabel="AL" itemValue="AL"/>
                                <f:selectItem itemLabel="PE" itemValue="PE"/>
                                <f:selectItem itemLabel="PB" itemValue="PB"/>
                                <f:selectItem itemLabel="RN" itemValue="RN"/>
                                <f:selectItem itemLabel="CE" itemValue="CE"/>
                                <f:selectItem itemLabel="PI" itemValue="PI"/>
                                <f:selectItem itemLabel="MA" itemValue="MA"/>
                                <f:selectItem itemLabel="TO" itemValue="TO"/>
                                <f:selectItem itemLabel="AP" itemValue="AP"/>
                                <f:selectItem itemLabel="PA" itemValue="PA"/>
                                <f:selectItem itemLabel="RR" itemValue="RR"/>
                                <f:selectItem itemLabel="AM" itemValue="AM"/>
                                <f:selectItem itemLabel="RO" itemValue="RO"/>
                            </h:selectOneMenu>
                            <p:message  for="UF" />
                        </h:panelGroup>
                        <h:outputText/>
                        <h:outputLabel value="ANTT:"/>
                        <h:panelGroup>
                            <h:inputText value="#{veiculoTranspMB.veiculoTransp.RNTC}" id="RNTC" maxlength="20" size="20"/>
                            <p:message  for="RNTC" />
                        </h:panelGroup>
                        <h:outputText/>
                        <h:outputLabel value="Tipo de Veiculo:"/>
                        <h:panelGroup>
                            <h:selectOneMenu value="#{veiculoTranspMB.veiculoTransp.tipoVeiculo}" id="tipoVeiculo" >
                                <f:selectItem itemLabel="Selecione" itemValue="" />
                                <f:selectItem itemLabel="Reboque" itemValue="2" />
                                <f:selectItem itemLabel="Caminhão" itemValue="1"  />
                            </h:selectOneMenu>
                        </h:panelGroup>
                        <h:outputText />
                        <p:commandButton value="Salvar" style=" margin-right: 10px;" action="#{veiculoTranspMB.salvar}" ajax="false" />
                        <p:commandButton value="Limpar" style=" margin-right: 10px;" type="reset" />
                        <p:button outcome="veiculoTranpoList" value="Cancelar" style="margin-left: 10px;"/>
                    </h:panelGrid>
                </h:form>
                <h:form>
                    <p:dialog id="dialog" header="Busca de Transportadores" widgetVar="modal" modal="true" height="500" width="900" >
                        <h:panelGrid columns="3">
                            <h:outputText value="Nome:" />
                            <h:inputText value="#{veiculoTranspMB.nome}"/>
                            <p:commandButton value="Consulta" update="table" async="true" actionListener="#{veiculoTranspMB.consultaTransportador}"/>
                        </h:panelGrid>
                        <p:dataTable height="100" id="table" value="#{veiculoTranspMB.transportadores}"  var="t"
                                     emptyMessage="Nenhum Transportador Encotrado"
                                     selection="#{veiculoTranspMB.veiculoTransp.transportador}"
                                     selectionMode="single" >
                            <f:facet name="header">
                                <h:outputText value="Transportadores"/>
                            </f:facet>
                            <p:column>
                                <f:facet name="header" >
                                    <h:outputText value="transportador"/>
                                </f:facet>
                                <h:outputText value="#{t.xNome}"/>
                            </p:column>
                            <p:column>
                                <f:facet name="header" >
                                    <h:outputText value="CPF/CNPJ"/>
                                </f:facet>
                                <h:outputText value="#{t.CPF} #{t.CNPJ}"/>
                            </p:column>
                            <f:facet name="footer" >
                                <p:commandButton update="form" value="Selecionar" onclick="modal.hide()"/>
                            </f:facet>
                        </p:dataTable>
                    </p:dialog>
                </h:form>
            </p:panel>
            <ui:include src="/includes/rodape.xhtml"/>
        </f:view>
    </h:body>
</html>

Espero que te ajude!!