[Resolvido] Gravar dados BD com JSF

5 respostas
EHS
Bom galera, estou começando com JSF e naum to conseguindo salvar os dados no bd. O erro que ocorre é o seguinte:
javax.servlet.ServletException: #{pessoa.inserir}: javax.el.MethodNotFoundException: Method not found: [email removido]()

root cause

javax.faces.FacesException: #{pessoa.inserir}: javax.el.MethodNotFoundException: Method not found: [email removido]()

root cause

javax.faces.el.MethodNotFoundException: javax.el.MethodNotFoundException: Method not found: [email removido]()

root cause

javax.el.MethodNotFoundException: Method not found: [email removido]()
e essas são minhas classes:
public class Pessoa {
    private String nome = null;
    private String endereco = null;
    private String cidade = null;
    private String telefone = null;

    public String getCidade() {
        return cidade;
    }

    public void setCidade(String cidade) {
        this.cidade = cidade;
    }

    public String getEndereco() {
        return endereco;
    }

    public void setEndereco(String endereco) {
        this.endereco = endereco;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }
}
public class PessoaJdbc {

    private Pessoa pessoa = new Pessoa();
    private static PreparedStatement pstmt = null;
    private String result_busca = null;
    private String result_inserir = null;

    public static final String BUSCA_INVALIDA = "failure";
    public static final String BUSCA_VALIDA = "success";
    public static final String SUCESSO_INSERCAO = "success";
    public static final String FALHA_INSERCAO = "failure";

    public String inserir() throws SQLException {
        pstmt = Conexao.getConexao().prepareStatement(
                    "Insert into pessoa(nome, endereco, cidade, telefone) values(?,?,?,?)");
            pstmt.setString(1, pessoa.getNome());
            pstmt.setString(2, pessoa.getEndereco());
            pstmt.setString(3, pessoa.getCidade());
            pstmt.setString(4, pessoa.getTelefone());
            pstmt.executeUpdate();
            pstmt.close();
            return null;
    }

    public Pessoa getPessoa() {
        return pessoa;
    }

    public void setpessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }
}

Já agradeço qualquer ajuda.

5 Respostas

programadora

Parece que você está referenciando a classe Pessoa no jsf, e não a classe PessoaJdbc. A classe pessoa não possui o método inserir(). O que você pode fazer é criar um método inserir na classe Pessoa que chame o método inserir de PessoaJdbc. Porém, devo lembrá-lo de que esta sugestão não é uma boa prática de programação.
Eu criaria uma classe Controller que teria um método inserir que poderia ser responsável por validações de negócio, por exemplo, e que chamaria o método inserir de PessoaJdbc.

vlw

EHS

Obrigado pela ajuda, mas agora está ocorrendo outro, está dizendo que a coluna nome naum pode ser null, mas naum estou entendo o que to fazendo errado para vim esse erro.

Erro
exception

javax.servlet.ServletException: #{pessoaJdbc.inserir}: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'nome' cannot be null

root cause

javax.faces.FacesException: #{pessoaJdbc.inserir}: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'nome' cannot be null

root cause

javax.faces.el.EvaluationException: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'nome' cannot be null

root cause

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'nome' cannot be null
Classe que salva BD
public class PessoaJdbc {

    private Pessoa pessoa = new Pessoa();
    private static PreparedStatement pstmt = null;
    private String result_busca = null;
    private String result_inserir = null;

    public static final String BUSCA_INVALIDA = "failure";
    public static final String BUSCA_VALIDA = "success";
    public static final String SUCESSO_INSERCAO = "success";
    public static final String FALHA_INSERCAO = "failure";

    public String inserir() throws SQLException {
        pstmt = Conexao.getConexao().prepareStatement(
                    "Insert into pessoa(nome, endereco, cidade, telefone) values(?,?,?,?)");
            pstmt.setString(1, pessoa.getNome());
            pstmt.setString(2, pessoa.getEndereco());
            pstmt.setString(3, pessoa.getCidade());
            pstmt.setString(4, pessoa.getTelefone());
            pstmt.executeUpdate();
            pstmt.close();
            return null;
    }

    public Pessoa getPessoa() {
        return pessoa;
    }

    public void setpessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }
}

para aplicações desktop eu tenho que passar um parametro do tipo objeto pessoa para o metodo inserir, mas pelo que andei lendo em JSF isso naum é preciso, é só criar um objeto do tipo pessoae usa-lo nos metodos, seria isso mesmo, ou estou muito perdido ??

programadora

Tipo, o que está acontecendo é que na classe PessoaJdbc você está criando um objeto pessoa nesta linha:

private Pessoa pessoa = new Pessoa();

e não o está preenchendo (seus atributos estão nulos).
Faz assim, cria um método “inserir” em Pessoa e passe o objeto atual para PessoaJdbc (através do método setPessoa()) e logo em seguida, chame o método inserir() de PessoaJdbc.
mais ou menos assim:

public class Pessoa{ //métodos gets e sets public String inserir(){ try{ //instancia uma PessoaJdbc através dos mecanismos que vc criou //com a refência em mãos, chama o método setPessoa() passando o objeto pessoa pessoaJdbc.setPessoa(this); //chama o método inserir() return pessoaJdbc.inserir(); }catch(SQLException){ //faz o tratamento de exceções return null; } } }

Não esquece de alterar a chamada na página.
Lembrando mais uma vez que o melhor seria criar um controller e “jogar” nele as regras de negócio e chamadas ao banco.

LPJava

bem, os erros que estao dando, mais claro que aquilo é quase impossivel, um fala que a column nao pode ser null, isso é la no banco e outro, é o metodo da classe.

Bem, dar uma olhada em alguns posts meu sobre o assunto, o segredo é chamar a coisa certa no controller, independente se vc usa jdbc ou um framework de persistencia, ja que o front-end n depende disso.

Vai ter que ver alguns posts antigo, dar uma navega que tu acha a solucao que precisa :slight_smile:
http://blog.camilolopes.com.br/category/jsf/

flw.

EHS

Bom galera, demorei um pouco para responder pq fui viajar fim de semana, mas consegui resolver o meu problema, e fiz como vcs falaram, criei uma classe controller e tudo funcionou.

vlw pela ajuda.

Criado 21 de janeiro de 2011
Ultima resposta 24 de jan. de 2011
Respostas 5
Participantes 3