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:
- 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)
- 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.
- 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]