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