3
respostas

Conexão com o BD via Java Web

Boa tarde, estou tentando desenvolver um cadastro de contatos via web. Porém está acontecendo esse erro.

GRAVE: Servlet.service() for servlet [springmvc] in context with path [/PresentesEmPalavras] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException
    at br.com.presentesempalavras.contatos.dao.JdbcContatoDao.adiciona(JdbcContatoDao.java:34)
    at br.com.presentesempalavras.contatos.controller.ContatosController.adiciona(ContatosController.java:21)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:214)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:748)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:931)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:833)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:807)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:670)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

Está acontecendo um NullPointerException, porém eu não sei como corrigir. O erro aparece quando tento adicionar um novo contato.

package br.com.presentesempalavras.contatos.dao;

import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.sql.DataSource;

import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import br.com.presentesempalavras.contatos.modelo.Contato;

@Repository
public class JdbcContatoDao {
    private final Connection connection;

    @Autowired
    public JdbcContatoDao(DataSource dataSource) {
        try {
            this.connection = dataSource.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public void adiciona(Contato contato) {
        String sql = "insert into contatos (nome, sexo, dataContato, canalContato, interesse, dataEvento, "
                + "estado, email, dataCurtida, estatus, finalizado, dataFinalizacao) values (?,?,?,?,?,?,?,?,?,?,?,?)";
        PreparedStatement stmt;
        try {

            stmt = connection.prepareStatement(sql);
            stmt.setString(1, contato.getNome());
            stmt.setString(2, contato.getSexo());
            stmt.setDate(3, new Date(contato.getDataContato().getTimeInMillis()));
            stmt.setString(4, contato.getCanalContato());
            stmt.setString(5, contato.getInteresse());
            stmt.setDate(6, new Date(contato.getDataEvento().getTimeInMillis()));
            stmt.setString(7, contato.getEstado());
            stmt.setString(8, contato.getEmail());
            stmt.setDate(9, new Date(contato.getDataCurtida().getTimeInMillis()));
            stmt.setString(10, contato.getEstatus());
            stmt.setBoolean(11, contato.isFinalizado());
            stmt.setDate(12, new Date(contato.getDataFinalizacao().getTimeInMillis()));
            stmt.execute();
            stmt.close();
            System.out.println(contato.getNome());
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public void remove(Contato contato) {

        if (contato.getId() == null) {
            throw new IllegalStateException("Id da tarefa não deve ser nula.");
        }

        String sql = "delete from contatos where id = ?";
        PreparedStatement stmt;
        try {
            stmt = connection.prepareStatement(sql);
            stmt.setLong(1, contato.getId());
            stmt.execute();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public void altera(Contato contato) {
        String sql = "update contatos set nome = ?, sexo = ?, dataContato = ?, canalContato = ?,"
                + " interesse = ?, dataEvento = ?, estado = ?, email = ?, dataCurtida = ?,"
                + " estatus = ?, finalizado = ?, dataFinalizacao = ? where id = ?";
        PreparedStatement stmt;
        try {
            stmt = connection.prepareStatement(sql);
            stmt.setString(1, contato.getNome());
            stmt.setString(2, contato.getSexo());
            stmt.setDate(3, new Date(contato.getDataContato().getTimeInMillis()));
            stmt.setString(4, contato.getCanalContato());
            stmt.setString(5, contato.getInteresse());
            stmt.setDate(6, new Date(contato.getDataEvento().getTimeInMillis()));
            stmt.setString(7, contato.getEstado());
            stmt.setString(8, contato.getEmail());
            stmt.setDate(9, new Date(contato.getDataCurtida().getTimeInMillis()));
            stmt.setString(10, contato.getEstatus());
            stmt.setBoolean(11, contato.isFinalizado());
            stmt.setDate(12, new Date(contato.getDataFinalizacao().getTimeInMillis()));
            stmt.setLong(13, contato.getId());
            stmt.execute();

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public List<Contato> lista() {
        try {
            List<Contato> contatos = new ArrayList<Contato>();
            PreparedStatement stmt = this.connection
                    .prepareStatement("select * from contatos");

            ResultSet rs = stmt.executeQuery();

            while (rs.next()) {
                // adiciona a tarefa na lista
                contatos.add(populaContato(rs));
            }

            rs.close();
            stmt.close();

            return contatos;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public void exporta() throws ClassNotFoundException{
        try{
         Statement statement = connection.createStatement();
         FileOutputStream fileOut;
         fileOut = new FileOutputStream("teste.xls");
         HSSFWorkbook workbook = new HSSFWorkbook();
         HSSFSheet worksheet = workbook.createSheet("Sheet 0");
         HSSFRow row1 = worksheet.createRow((short)0);
         row1.createCell((short)0).setCellValue("Name");
         row1.createCell(1).setCellValue("Address");
         Row row2 ;
         ResultSet rs = statement.executeQuery("SELECT * FROM contatos");
         while(rs.next()){
             int a = rs.getRow();
             row2 = worksheet.createRow((short)a);
             row2.createCell(0).setCellValue(rs.getString(1));
             row2.createCell(1).setCellValue(rs.getString(2));
         }
         workbook.write(fileOut);
         fileOut.flush();
         fileOut.close();
         rs.close();
         statement.close();
         connection.close();
         System.out.println("Export Success");
     }catch(SQLException ex){
         System.out.println(ex);
     }catch(IOException ioe){
         System.out.println(ioe);
     }

 }



    public Contato buscaPorId(Long id) {

        if (id == null) {
            throw new IllegalStateException("Id da tarefa não deve ser nula.");
        }

        try {
            PreparedStatement stmt = this.connection
                    .prepareStatement("select * from contatos where id = ?");
            stmt.setLong(1, id);

            ResultSet rs = stmt.executeQuery();

            if (rs.next()) {
                return populaContato(rs);
            }

            rs.close();
            stmt.close();

            return null;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public void finaliza(Long id) {

        if (id == null) {
            throw new IllegalStateException("Id da tarefa não deve ser nula.");
        }

        String sql = "update contatos set finalizado = ?, dataFinalizacao = ? where id = ?";
        PreparedStatement stmt;
        try {
            stmt = connection.prepareStatement(sql);
            stmt.setBoolean(1, true);
            stmt.setDate(2, new Date(Calendar.getInstance().getTimeInMillis()));
            stmt.setLong(3, id);
            stmt.execute();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    private Contato populaContato(ResultSet rs) throws SQLException {
        Contato contato = new Contato();

        System.out.println(contato.getNome());

        // popula o objeto tarefa
        contato.setId(rs.getLong("id"));
        contato.setNome(rs.getString("nome"));
        contato.setSexo(rs.getString("sexo"));

        // popula a data do contato, fazendo a conversao
        Date data1 = rs.getDate("dataContato");
        if (data1 != null) {
            Calendar dataContato = Calendar.getInstance();
            dataContato.setTime(data1);
            contato.setDataContato(dataContato);
        }
        contato.setCanalContato(rs.getString("canalContato"));
        contato.setInteresse(rs.getString("interesse"));
        Date data2 = rs.getDate("dataEvento");
        if (data2 != null){
            Calendar dataEvento = Calendar.getInstance();
            dataEvento.setTime(data2);
            contato.setDataEvento(dataEvento);
        }
        contato.setEstado(rs.getString("estado"));
        contato.setEmail(rs.getString("email"));
        Date data3 = rs.getDate("dataCurtida");
        if (data3 != null){
            Calendar dataCurtida = Calendar.getInstance();
            dataCurtida.setTime(data3);
            contato.setDataCurtida(dataCurtida);
        }
        contato.setEstatus(rs.getString("estatus"));
        contato.setFinalizado(rs.getBoolean("finalizado"));
        Date data4 = rs.getDate("dataFinalizacao");
        if (data4 != null){
            Calendar dataFinalizacao = Calendar.getInstance();
            dataFinalizacao.setTime(data4);
            contato.setDataFinalizacao(dataFinalizacao);
        }
        return contato;
    }
}

O erro está acontecendo na função adiciona. E como eu estou utilizando o SpringMVC o meu ControllerContatos está desta forma:

package br.com.presentesempalavras.contatos.controller;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;

import br.com.presentesempalavras.contatos.dao.JdbcContatoDao;
import br.com.presentesempalavras.contatos.modelo.Contato;

@Controller
public class ContatosController {

    private final JdbcContatoDao dao;

    @Autowired
    public ContatosController(JdbcContatoDao dao){
        this.dao = dao;
    }

    @RequestMapping("novoContato")
    public String form() {
        return "contato/adiciona-contato";
    }

    @RequestMapping("adicionaContato")
    public String adiciona(@Valid Contato contato, BindingResult result){

        if (result.hasFieldErrors("nome")){
            return "contato/adiciona-contato";
        }

        dao.adiciona(contato);
        return "contato/adicionado";
    }

    public String exportar() throws ClassNotFoundException{

        dao.exporta();
        return "contato/exportado";

    }
}

Esse é meu primeiro projeto que estou tentando desenvolver sozinho, essa minha duvida deve ser bem básica, mais eu estou travado nela. Qualquer ajuda será bem vinda! Obrigado

3 respostas

Oi Arthur, muito código aí... meu chute é que tem algo no seu contato que não está preenchido. Vc precisa ir na linha exata e verificar qual informação está nula.. Por exemplo contato.getDataContato()

O contato ta nulo? o retorno do getDataContato ta nulo?

Foi mal pelo tamanho do meu post.... foi minha primeira postagem. Nas próximas postagens vou tentar ser mais sucinto. Minha classe contato com os getter and setters está assim:

package br.com.presentesempalavras.contatos.modelo;

import java.util.Calendar;

public class Contato {
    private Long id;
    private String nome;
    private String sexo;
    private Calendar dataContato;
    private String canalContato;
    private String interesse;
    private Calendar dataEvento;
    private String estado;
    private String email;
    private Calendar dataCurtida;
    private String estatus;
    private boolean finalizado;
    private Calendar dataFinalizacao;


    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
    public String getSexo() {
        return sexo;
    }
    public void setSexo(String sexo) {
        this.sexo = sexo;
    }

Mais eu não entendi como eu posso garantir que os valores das variáveis não sejam nulos? Sendo que os valores estão sendo recebidos através do formulário em .jsp

Você precisa validar os dados que estão chegando... NullPointer é erro nosso, do programador.. vc precisa garantir que todos os dados estão válidos para trabalhar com eles.