Moçada, bom dia.
To seguindo a apostila da caelum, melhor dizendo, implementando o exercício sobre inserção no banco de dados com Struts2.
Trata-se de uma simples aplicação de cadastro de tarefas.
Fiz igual está no exercício. A classe TarefaDAO fiz sozinho (Esta nao está na apostila). A classe de conexão com o banco Mysql fiz sozinho também.
O resto está identico ao exercicio da apostila. Porém ao executar tal aplicação, é gerado uma excessão java.lang.NullPointerException.
Creio que o problema é na população do objeto Tarefa através do formulário. Entretanto, não consigo solucionar esse problema.
A seguir vou mostrar o código completo do exercicio que fiz. Finalizando mostro o código de erro. SEGUE:
CAMADAS DE VISUALIZAÇÃO
<%--
Document : formulario-tarefas
Created on : 25/06/2011, 16:17:17
Author : THIAGO
--%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Formulário Tarefas</title>
</head>
<body>
<h2>Adicionar Tarefas</h2>
<form action="adicionaTarefa" method="POST">
<p>Descrição:</p>
<textarea name="tarefa.descricao" rows="5" cols="100"></textarea>
<input type="submit" value="Adicionar" />
</form>
</body>
</html>
<%--
Document : tarefa-adicionada
Created on : 25/06/2011, 16:55:30
Author : THIAGO
--%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Confirmação</title>
</head>
<body>
<h2>Tarefa Adicionada com sucesso!!</h2>
</body>
</html>
CLASSE DE CONEXÃO COM O BD MYSQL
package Conexao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class ConexaoMysql {
public static Connection getConexao()
{
try
{
return DriverManager.getConnection("jdbc:mysql://localhost/agenda", "root", "");
}
catch(SQLException e)
{
System.out.println("Falha na conexão com o Mysql");
return null;
}
}
}
CLASSE BEANS TAREFA
package beans;
import java.util.Calendar;
public class Tarefa {
private Long id;
private String descricao;
private boolean finalizado;
private Calendar dataFinalizacao;
public Calendar getDataFinalizacao() {
return dataFinalizacao;
}
public void setDataFinalizacao(Calendar dataFinalizacao) {
this.dataFinalizacao = dataFinalizacao;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public boolean isFinalizado() {
return finalizado;
}
public void setFinalizado(boolean finalizado) {
this.finalizado = finalizado;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
CLASSE DE PERSISTÊNCIA TarefaDAO
package DAO;
import Conexao.ConexaoMysql;
import beans.Tarefa;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class TarefaDAO {
private Connection con;
private PreparedStatement stmt;
public void adiciona(Tarefa tarefa) throws SQLException
{
try
{
this.con = ConexaoMysql.getConexao();
this.stmt = con.prepareStatement("insert into tarefas (descricao) values (?)");
this.stmt.setString(1, tarefa.getDescricao());
this.stmt.execute();
this.stmt.close();
this.con.close();
}
catch(SQLException e)
{
System.out.println("Falha na inclusão da tarefa!!");
}
finally{
this.stmt.close();
this.con.close();
}
}
}
CLASSE ACTION AdicionaTarefasAction
package action;
import DAO.TarefaDAO;
import beans.Tarefa;
import java.sql.SQLException;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
public class AdicionaTarefasAction {
private Tarefa tarefa;
@Action
(
value="adicionaTarefa",
results={@Result(name="ok",location="/tarefa-adicionada.jsp")}
)
public String execute() throws SQLException{
new TarefaDAO().adiciona(tarefa);
return "ok";
}
public Tarefa getTarefa() {
return tarefa;
}
public void setTarefa(Tarefa tarefa) {
this.tarefa = tarefa;
}
}
E POR ÚLTIMO CLARO, O ERRO GERADO NO BROWSER QUANDO SE “TENTA” ADICIONAR UMA TAREFA
java.lang.NullPointerException
DAO.TarefaDAO.adiciona(TarefaDAO.java:31)
action.AdicionaTarefasAction.execute(AdicionaTarefasAction.java:18)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:452)
com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:291)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:254)
com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:263)
org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:133)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:190)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:243)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:142)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:166)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:176)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:190)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:485)
org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
Postei este problema aqui no GUJ por que to a 1 dia tentando resolve isso sozinho, porém sem sucesso. Não tenho certeza, mas o que “me aparenta ser” é a população do objeto Tarefa na classe action.
<<DESDE JÁ AGRADEÇO POR QUALQUER AJUDA XD>>
vAlEeoowwW