Erro ao salvar no postgresql. Poll de conexões npe ou objeto con nulo?

5 respostas
L

Estou com problema referente a uma app web em que utilizo um pool de
conexões para fazer as operações crud no postgresql. No módulo cliente o crud funciona normalmente, mas na parte de produto, ao tentar gravar o produto a console apresenta um null pointer exception. Não consegui identificar se o problema se refere ao objeto connection con está nulo ou se é algum tipo de erro de cast do postgresql ou do java.

Alguém poderia me dar uma dica de identicar e de como fazer o tratamento desse problema.

Segue abaixo o erro apresentado na console e as classe da minha aplicação:

[code]

java.lang.NullPointerException
at br.com.siscom.produto.model.command.CadastrarProduto.execute(CadastrarProduto.java:28)
at br.com.siscom.controller.SiscomController.processarRequisicao(SiscomController.java:46)
at br.com.siscom.controller.SiscomController.doGet(SiscomController.java:32)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Unknown Source)

Abaixo a classe que implementa a interface command

package br.com.siscom.produto.model.command;

import java.sql.SQLException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.com.siscom.model.bean.Produto;
import br.com.siscom.model.command.InterfaceCommand;

import br.com.siscom.produto.model.dao.ProdutoDAO;

public class CadastrarProduto implements InterfaceCommand {
private ProdutoDAO produtoDAO;

public CadastrarProduto(ProdutoDAO produtoDAO) {
this.produtoDAO = produtoDAO;
}

@Override
public String execute(HttpServletRequest request,HttpServletResponse response) {

try{
Produto produto = new Produto();

produto.setNome_produto(request.getParameter("nome_produto").equals("") ? null :
request.getParameter("nome_produto"));
produto.setPreco_venda(request.getParameter("preco_venda").equals("") ? null:
Float.valueOf(request.getParameter("preco_venda")));
produto.setPreco_compra(request.getParameter("preco_compra").equals("") ? null :
Float.valueOf(request.getParameter("preco_compra")));
produto.setSaldo_estoque_atual(request.getParameter("saldo_estoque_atual").equals("") ? null :
Float.valueOf(request.getParameter("saldo_estoque_atual")));
produto.setQtd_atual(request.getParameter("qtd_atual").equals("") ? null :
Integer.valueOf(request.getParameter("qtd_atual")));
produto.setQtd_max(request.getParameter("qtd_max").equals("") ? null :
Integer.valueOf(request.getParameter("qtd_max")));
produto.setQtd_min(request.getParameter("qtd_min").equals("") ? null :
Integer.valueOf(request.getParameter("qtd_min")));

produtoDAO.salvar(produto);
request.setAttribute("mensagem", " Produto " +produto.getNome_produto()+
" Salvo com sucesso!");

}catch(SQLException e){
request.setAttribute("mensagem", " Erro ao Salvar Dados do Cliente! " +e.getMessage());
e.printStackTrace();
}catch(NumberFormatException e){
request.setAttribute("mensagem", " Valor Inválido: " +e.getMessage());
e.printStackTrace();

}

return "cadastrarProduto.jsp";
}

}

Abaixo a classe ProdutoDAO

package br.com.siscom.produto.model.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import br.com.siscom.conexao.InterfacePool;
import br.com.siscom.model.bean.Produto;

public class ProdutoDAO implements InterfaceProdutoDAO {
private Connection con;
private PreparedStatement ps;
private ResultSet rs;
private Statement st;
private String sql = null;

private InterfacePool pool;

public ProdutoDAO(InterfacePool pool){
this.pool = pool;

}

public void atualizar(Produto produto) throws SQLException {
con = pool.getConnection();
sql = "UPDATE produto SET nome_produto = ?,preco_venda = ?," +
"preco_compra = ?, saldo_estoque_atual = ?,qtd_atual = ?," +
"qtd_max = ?,qtd_min = ? WHERE id_produto = ?";

try {
ps = con.prepareStatement(sql);
ps.setString(1, produto.getNome_produto());
ps.setFloat(2, produto.getPreco_venda());
ps.setFloat(3, produto.getPreco_compra());
ps.setFloat(4, produto.getSaldo_estoque_atual());
ps.setInt(5, produto.getQtd_atual());
ps.setInt(6, produto.getQtd_max());
ps.setInt(7, produto.getQtd_min());
ps.setInt(8, produto.getId_produto());

ps.executeUpdate();
ps.close();
} finally {
pool.liberarConnection(con);
}
}

@Override
public void excluir(Integer id_produto) throws SQLException {
con = pool.getConnection();
ps = null;
sql = "DELETE FROM produto WHERE id_produto = ?";

try {
ps = con.prepareStatement(sql);
ps.setInt(1, id_produto);
ps.executeUpdate();
ps.close();
} finally {
pool.liberarConnection(con);
}
}

@Override
public Produto getProduto(Integer id_produto) throws SQLException {
con = pool.getConnection();
ps = null;
rs = null;
sql = "SELECT * FROM produto WHERE id_produto = ?";
Produto produto = null;

try {
ps = con.prepareStatement(sql);
ps.setInt(1, id_produto);
rs = ps.executeQuery();

produto= new Produto();
while(rs.next()) {
produto.setId_produto(rs.getInt("id_produto"));
produto.setNome_produto(rs.getString("nome_produto"));
produto.setPreco_venda(rs.getFloat("preco_venda"));
produto.setPreco_compra(rs.getFloat("preco_compra"));
produto.setSaldo_estoque_atual(rs.getFloat("saldo_estoque_atual"));
produto.setQtd_atual(rs.getInt("qtd_atual"));
produto.setQtd_max(rs.getInt("qtd_max"));
produto.setQtd_min(rs.getInt("qtd_min"));
}

rs.close();
ps.close();
} finally {
pool.liberarConnection(con);
}
return produto;
}

@Override
public ArrayList getProdutos() throws SQLException {
ArrayList resultado = new ArrayList();
sql = "SELECT * FROM produto;";
con = pool.getConnection();
st = con.createStatement();
rs = st.executeQuery(sql);

try {
while (rs.next()) {

Produto produto = new Produto();
produto.setId_produto(rs.getInt("id_produto"));
produto.setNome_produto(rs.getString("nome_produto"));
produto.setPreco_venda(rs.getFloat("preco_venda"));
produto.setPreco_compra(rs.getFloat("preco_compra"));
produto.setSaldo_estoque_atual(rs.getFloat("saldo_estoque_atual"));
produto.setQtd_atual(rs.getInt("qtd_atual"));
produto.setQtd_max(rs.getInt("qtd_max"));
produto.setQtd_min(rs.getInt("qtd_min"));

resultado.add(produto);
}
rs.close();
st.close();
} finally {
pool.liberarConnection(con);
}
return resultado;
}

public void salvar(Produto produto) throws SQLException {
Connection con = pool.getConnection();
PreparedStatement ps;
String sql = "insert into produto (nome_produto,preco_venda,preco_compra,saldo_estoque_atual, "
+"qtd_atual,qtd_max,qtd_min) values (?,?,?,?,?,?,?);";

try {
ps = con.prepareStatement(sql);

ps.setString(1,produto.getNome_produto());
ps.setFloat(2,produto.getPreco_venda());
ps.setFloat(3,produto.getPreco_compra());
ps.setFloat(4, produto.getSaldo_estoque_atual());
ps.setInt(5,produto.getQtd_atual());
ps.setInt(6,produto.getQtd_max());
ps.setInt(7,produto.getQtd_min());
ps.executeUpdate();
ps.close();

} finally {
pool.liberarConnection(con);
}
}

}

Abaixo A Interface que define os métodos do DAO:

package br.com.siscom.produto.model.dao;

import java.sql.SQLException;
import java.util.ArrayList;

import br.com.siscom.model.bean.Produto;

public interface InterfaceProdutoDAO {

public abstract void excluir(Integer id_produto)throws SQLException;
public abstract void salvar(Produto produto)throws SQLException;
public abstract void atualizar(Produto produto)throws SQLException;
public abstract Produto getProduto(Integer id_produto)throws SQLException;
public abstract ArrayList getProdutos()throws SQLException;

}

Abaixo o Bean produto:

package br.com.siscom.model.bean;

import java.util.ArrayList;

public class Produto {
private ArrayList itens;
private int id_produto;
private String nome_produto;
private float preco_venda;
private float preco_compra;
private float saldo_estoque_atual;
private int qtd_atual;
private int qtd_max;
private int qtd_min;


public Produto() {
super();
}

public Produto(ArrayListitens){
itens = new ArrayList();

}

public int getId_produto() {
return id_produto;
}

public void setId_produto(int id_produto) {
this.id_produto = id_produto;
}

public String getNome_produto() {
return nome_produto;
}

public void setNome_produto(String nome_produto) {
this.nome_produto = nome_produto;
}

public float getPreco_venda() {
return preco_venda;
}

public void setPreco_venda(float preco_venda) {
this.preco_venda = preco_venda;
}

public float getPreco_compra() {
return preco_compra;
}

public void setPreco_compra(float preco_compra) {
this.preco_compra = preco_compra;
}

public int getQtd_atual() {
return qtd_atual;
}

public void setQtd_atual(int qtd_atual) {
this.qtd_atual = qtd_atual;
}

public int getQtd_max() {
return qtd_max;
}

public void setQtd_max(int qtd_max) {
this.qtd_max = qtd_max;
}

public int getQtd_min() {
return qtd_min;
}

public void setQtd_min(int qtd_min) {
this.qtd_min = qtd_min;

}

public void setSaldo_estoque_atual(float saldo_estoque_atual){
this.saldo_estoque_atual = saldo_estoque_atual;
}

public float getSaldo_estoque_atual() {
return saldo_estoque_atual;
}

public ArrayList getItens() {
return itens;
}

public void setItens(ArrayList itens) {
this.itens = itens;
}

Abaixo o Controller:

package br.com.siscom.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.com.siscom.conexao.InterfacePool;
import br.com.siscom.conexao.Pool;
import br.com.siscom.model.command.InterfaceCommand;
import br.com.siscom.model.helper.SiscomHelper;

public class SiscomController extends HttpServlet {
private static final long serialVersionUID = 1L;

private InterfacePool pool = new Pool();
private SiscomHelper siscomHelper = new SiscomHelper(pool);

public SiscomController() {
super();

}

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processarRequisicao(request,response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processarRequisicao(request,response);
}

private void processarRequisicao(HttpServletRequest request, HttpServletResponse response)
throws ServletException,IOException{
try{
siscomHelper.setRequest(request);
InterfaceCommand comando = siscomHelper.getCommand();
String pagina = comando.execute(request, response);
request.getRequestDispatcher(pagina).include(request, response);
}catch(NullPointerException e){
e.printStackTrace();
}

}

}

Abaixo o Helper:

package br.com.siscom.model.helper;

import java.util.HashMap;

import javax.servlet.http.HttpServletRequest;

import br.com.siscom.conexao.InterfacePool;
import br.com.siscom.model.command.AtualizarCliente;
import br.com.siscom.model.command.CadastrarCliente;
import br.com.siscom.model.command.ConsultarCliente;
import br.com.siscom.model.command.EditarCliente;
import br.com.siscom.model.command.ExcluirCliente;
import br.com.siscom.model.command.IniciarSiscom;
import br.com.siscom.model.command.InterfaceCommand;
import br.com.siscom.model.command.ListarDadosCliente;
import br.com.siscom.model.dao.ClienteDAO;
import br.com.siscom.produto.model.command.AtualizarProduto;
import br.com.siscom.produto.model.command.CadastrarProduto;
import br.com.siscom.produto.model.command.EditarProduto;
import br.com.siscom.produto.model.command.ExcluirProduto;
import br.com.siscom.produto.model.command.ListarDadosProduto;
import br.com.siscom.produto.model.command.ListarTodosProdutos;
import br.com.siscom.produto.model.dao.ProdutoDAO;

public class SiscomHelper {
private HashMap mapaComandos;
private HttpServletRequest request;
private InterfacePool pool;

public SiscomHelper(InterfacePool pool) {
super();
this.pool = pool;
//this.request = request;

mapaComandos = new HashMap();
mapaComandos.put("cadastrarCliente", new CadastrarCliente(new ClienteDAO(pool)));
mapaComandos.put("consultarCliente", new ConsultarCliente(new ClienteDAO(pool)));
mapaComandos.put("atualizarCliente", new AtualizarCliente(new ClienteDAO(pool)));
mapaComandos.put("editarCliente",new EditarCliente(new ClienteDAO(pool)));
mapaComandos.put("excluirClientes", new ExcluirCliente(new ClienteDAO(pool)));
mapaComandos.put("listarDadosCliente", new ListarDadosCliente(new ClienteDAO(pool)));

mapaComandos.put("atualizarProduto", new AtualizarProduto(new ProdutoDAO(pool)));
mapaComandos.put("cadastrarProduto", new CadastrarProduto(new ProdutoDAO(pool)));
mapaComandos.put("editarProduto", new EditarProduto(new ProdutoDAO(pool)));
mapaComandos.put("excluirProduto", new ExcluirProduto(new ProdutoDAO(pool)));
mapaComandos.put("listarDadosProduto",new ListarDadosProduto(new ProdutoDAO(pool)));
mapaComandos.put("listarTodosProdutos", new ListarTodosProdutos(new ProdutoDAO(pool)));
mapaComandos.put("iniciarSiscom", new IniciarSiscom());
}

public InterfaceCommand getCommand(){
String cmd = request.getParameter("cmd");
if(cmd == null)
return mapaComandos.get("iniciarSiscom");
return mapaComandos.get(cmd);
}

public void setRequest(HttpServletRequest request) {
this.request = request;
}

}

Classe DataSource:

package br.com.siscom.conexao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DataSource implements InterfaceDataSource {

private String url;
private String driver;
private String usuario;
private String senha;

public DataSource(String url, String driver, String usuario, String senha) {
super();
this.url = url;
this.driver = driver;
this.usuario = usuario;
this.senha = senha;

try {
Class.forName(driver);
System.out.println("Conectado ao banco de dados!");
} catch (ClassNotFoundException e) {
System.out.println("Classe não encontrada!");

}
}

@Override
public Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,usuario,senha);
}

}


Classe Pool:

package br.com.siscom.conexao;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.ResourceBundle;
import java.util.concurrent.ArrayBlockingQueue;

public class Pool implements InterfacePool{
private InterfaceDataSource ds;
private ArrayBlockingQueue conexoesLivres;
private HashMap conexoesUtilizadas;
private Integer numMaxConexoes;
private ResourceBundle config;

public Pool(){
config = ResourceBundle.getBundle("br.com.siscom.conexao.postgresql");

ds = new DataSource(config.getString("url"),
config.getString("driver"),
config.getString("usuario"),
config.getString("senha"));

numMaxConexoes = Integer.parseInt(config.getString("numMaxConexoes"));

conexoesLivres = new ArrayBlockingQueue(numMaxConexoes, true);

conexoesUtilizadas = new HashMap();

}

@Override
public Connection getConnection() {
Connection con = null;

try{
if(conexoesUtilizadas.size() < numMaxConexoes){
con = conexoesLivres.poll();
if(con == null){
con = ds.getConnection();
}
else if(con.isClosed()){
this.getConnection();
}
conexoesUtilizadas.put(con.toString(),con);

}
}catch(SQLException e){
System.out.println("Problema com o Pool!");
}
return con;
}

@Override
public void liberarConnection(Connection con) {
conexoesLivres.add(con);
conexoesUtilizadas.remove(con.toString());

}
}

Arquivo postgresql.properties:

driver=org.postgresql.Driver
url=jdbc:postgresql://localhost:5432/siscom
usuario=siscom
senha=siscom
numMaxConexoes =1

5 Respostas

Hebert_Coelho

laorso, bem vindo ao guj

  1. troque as tags por [code ], assim seu código irá ficar formatado bonito
  2. evite colocar tanto código assim, até desanima de ver. [=
  3. Seu nullpointer está nessa linha né at br.com.siscom.produto.model.command.CadastrarProduto.execute(CadastrarProduto.java:28) ? Tem como você postar oq tem nessa linha?
L

Desculpe pela quantidade excessiva de códigos. Segue abaixo a linha que apresenta o npe:

produto.setNome_produto(request.getParameter("nome_produto").equals("") ? null : request.getParameter("nome_produto"));

Antes eu havia colocado a linha no formato abaixo, mas estava danto null pointer exception e mudei para a linha acima e continuou
o mesmo erro de npe

produto.setNome_produto(request.getParameter("nome_produto"));
Hebert_Coelho

Cara, eu acho que o seu request está null.

Pq vc está usando execute? E não o método post da vida?

L

Utilizei o método execute do tipo String para retorna a página jsp “cadastroProduto”, assim como todas as outras páginas.
Consigo acessar normalmente, a partir da página jsp principal da aplicação, as páginas jsp colsultar produto, excluir produto, listar todos produtos e listar produto, e fazer as respectivas operações no postgresqls.

Entretanto, ao chamar a página cadastrarProduto.jsp diretamente da página principal da aplicação, ela já de início apresenta esse
erro de nullpointer exception. O estranho é que se eu chamá-la diretamente ela carrega e consigo salvar os
dados no postgresql normalmente.

Depois da sua sugestão, setei no form o método “post” e criei o método processar requisição do tipo void e no método String Execute invoquei ele, porém continua o mesmo problema na mesma linha. segue abaixo o código alterado:

@Override
	public String execute(HttpServletRequest request,HttpServletResponse response) {

		processarRequisicao(request,response);
		return "cadastrarProduto.jsp";
	}

	@Override
	public void processarRequisicao(HttpServletRequest request,HttpServletResponse response) {
		try{
			Produto produto = new Produto();

		ERRO	=>produto.setNome_produto(request.getParameter("nome_produto").equals("") ? null :
				request.getParameter("nome_produto"));
			produto.setPreco_venda(request.getParameter("preco_venda").equals("") ? null:
				Float.valueOf(request.getParameter("preco_venda")));
			produto.setPreco_compra(request.getParameter("preco_compra").equals("") ? null :
				Float.valueOf(request.getParameter("preco_compra")));
			produto.setSaldo_estoque_atual(request.getParameter("saldo_estoque_atual").equals("") ? null :
				Float.valueOf(request.getParameter("saldo_estoque_atual")));
			produto.setQtd_atual(request.getParameter("qtd_atual").equals("") ? null :
				Integer.valueOf(request.getParameter("qtd_atual")));
			produto.setQtd_max(request.getParameter("qtd_max").equals("") ? null :
				Integer.valueOf(request.getParameter("qtd_max")));
			produto.setQtd_min(request.getParameter("qtd_min").equals("") ? null :
				Integer.valueOf(request.getParameter("qtd_min")));

			produtoDAO.salvar(produto);
			request.setAttribute("mensagem", " Produto " +produto.getNome_produto()+ 
			" Salvo com sucesso!");

		}catch(SQLException e){
			request.setAttribute("mensagem", " Erro ao Salvar Dados do Cliente! " +e.getMessage());
			e.printStackTrace();
		}catch(NumberFormatException e){
			request.setAttribute("mensagem", " Valor Inválido: " +e.getMessage());
			e.printStackTrace();

		}
	}

}

Segue também o Stacktrace: o mesmo erro, na mesma linha. Vou tentar debugar a aplicação, apesar de não ter muita experiência com o debugger e retornar os valores para você poder dar uma analisada melhor. Muítissimo obrigado pela sua atenção.

java.lang.NullPointerException
	at br.com.siscom.produto.model.command.CadastrarProduto.processarRequisicao(CadastrarProduto.java:35)
	at br.com.siscom.produto.model.command.CadastrarProduto.execute(CadastrarProduto.java:25)
	at br.com.siscom.controller.SiscomController.processarRequisicao(SiscomController.java:46)
	at br.com.siscom.controller.SiscomController.doGet(SiscomController.java:32)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
L

Setei o breakpoint na linha que está apresentando erro e fiz o debug. Os objetos com seus respectivos valores estão logo abaixo.
Por gentileza, você poderia traduzir isso para mim?

Name Value
This = CadastarProduto (id=57)
produtoDAO =ProdutoDAO (id=156)
con = null
pool =Pool (id=159)
ps =null
rs =null
sql =null
st =null

Request = RequestFacade (id= 69)
Request = Request (id=80)
Attributes= HashMap<K,V> (id=82)
entrySet = null
keySet = null
loadFactor = 0.75
modCount = 1
Size = 0
Table = HashMap$Entry<K,V>[16] (id=149)
Threshold =12


Values = null

Não sei trabalhar com o debug, mas por alto percebi que os objetos con,ps,rs,sql(string de consulta) e rs estão todos com valor nulo. Apesar de conseguir conectar ao banco.

Em relação a request me corrija se eu estiver enganado, no atributo HashMap<K,V> o entrySet e o keyset se referem as chaves Key e Value? Ambos os objetos estão setados com null. O problema não deve ser na request, pois consigo acessar as outras jsp da minha aplicação.

O objeto Values, no final da tabela que eu estou te enviando, que tem o valor null é um atributo do Objeto Request que indica que ele está nulo e é aqui que se encontra o erro?

Não quero abusar da sua boa vontade, mas você poderia me explicar esses valores para que eu possa identificar e fazer o tratamento
do erro?

Mais uma vez, mutíssimo obrigado pela sua atenção!

Criado 15 de abril de 2012
Ultima resposta 15 de abr. de 2012
Respostas 5
Participantes 2