[b]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.[/b]
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<Produto> getProdutos() throws SQLException {
ArrayList<Produto> resultado = new ArrayList<Produto>();
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<Produto> 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(ArrayList<ItemPedidoVenda>itens){
itens = new ArrayList<ItemPedidoVenda>();
}
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<ItemPedidoVenda> getItens() {
return itens;
}
public void setItens(ArrayList<ItemPedidoVenda> 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<String,InterfaceCommand> mapaComandos;
private HttpServletRequest request;
private InterfacePool pool;
public SiscomHelper(InterfacePool pool) {
super();
this.pool = pool;
//this.request = request;
mapaComandos = new HashMap<String,InterfaceCommand>();
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<String,Connection> 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<Connection>(numMaxConexoes, true);
conexoesUtilizadas = new HashMap<String,Connection>();
}
@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