Inserindo valores do formulário no banco de dados com Struts2[RESOLVIDO]

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

Oi!

Essa exceção é causada por algo desse tipo:

Object obj = null; obj.someMethod();

Você tem um objeto ou referência nula e tenta executar alguma ação, chamar um método.
Aposto que a sua variavél ‘con’, que representa a conexão é nula e quando tentas dar um close gera a exceção.

Três coisas:

1 - Você colocou System.out.println() em algumas SQLException, veja se nenhuma destas mensagens está sendo apresentada. Não omita uma SQLException, você não sabe exatamente o que houve na exceção, saiba como trata-la.

2 - Verifique se o seu banco está no ar e se a URL de acesso está correta, faça uma simples classe de teste, com um Main, buscando a conexão e veja se a obtém corretamente. É um teste rápido, simples mas muito eficiente.

3 - Estas linhas: finally{ this.stmt.close(); this.con.close();
é onde é indicado a exceção, faça algo como:

finally{ 
            if(null != this.stmt)  
                 this.stmt.close();   
            if(null != this.con)
                  this.con.close();  

Afinal, está em um bloco finally onde você não garante que a variavél não venha a ser nula. Está fazendo assim, nesse caso.

this.null.close()

Entendeu? Fique atento a minha primeira dica.
Abraços.

[quote=nel]Oi!

Essa exceção é causada por algo desse tipo:

Object obj = null; obj.someMethod();

Você tem um objeto ou referência nula e tenta executar alguma ação, chamar um método.
Aposto que a sua variavél ‘con’, que representa a conexão é nula e quando tentas dar um close gera a exceção.

Três coisas:

1 - Você colocou System.out.println() em algumas SQLException, veja se nenhuma destas mensagens está sendo apresentada. Não omita uma SQLException, você não sabe exatamente o que houve na exceção, saiba como trata-la.

2 - Verifique se o seu banco está no ar e se a URL de acesso está correta, faça uma simples classe de teste, com um Main, buscando a conexão e veja se a obtém corretamente. É um teste rápido, simples mas muito eficiente.

3 - Estas linhas: finally{ this.stmt.close(); this.con.close();
é onde é indicado a exceção, faça algo como:

finally{ 
            if(null != this.stmt)  
                 this.stmt.close();   
            if(null != this.con)
                  this.con.close();  

Afinal, está em um bloco finally onde você não garante que a variavél não venha a ser nula. Está fazendo assim, nesse caso.

this.null.close()

Entendeu? Fique atento a minha primeira dica.
Abraços.[/quote]

Realmente cara, o erro é desse tipo. Porém não reconhece o Driver JDBC do Mysql

E o erro que aparece na console encontrei apenas esse:

Falha na conexão com o Mysql! - No suitable driver found for jdbc:mysql://localhost/agenda

fiz apenas uma modificação no catch da classe de conexão

segue:

public class ConexaoMysql { public Connection getConexao() { try { return DriverManager.getConnection("jdbc:mysql://localhost/agenda", "root", ""); } catch(SQLException e) { System.out.println("Falha na conexão com o Mysql! - " + e.getMessage()); return null; } } }

O estranho é que, a Jar do mysql está la. Sempre clico com o botao direito no projeto, após, propriedades! Em bibliotecas, adiciono esse Jar (mysql-connector-java-5.1.13-bin.jar)

Ate exclui este e inseri dinovo pra notificar a certeza!

Mas o erro continua.

Fiz algo errado pra inserir essa JAR?

Espero ter sido Claro com a pergunta! E Valeu pela ajuda anterior.

Abraço.

[quote=Thiago de Paula Beserra][quote=nel]Oi!

Essa exceção é causada por algo desse tipo:

Object obj = null; obj.someMethod();

Você tem um objeto ou referência nula e tenta executar alguma ação, chamar um método.
Aposto que a sua variavél ‘con’, que representa a conexão é nula e quando tentas dar um close gera a exceção.

Três coisas:

1 - Você colocou System.out.println() em algumas SQLException, veja se nenhuma destas mensagens está sendo apresentada. Não omita uma SQLException, você não sabe exatamente o que houve na exceção, saiba como trata-la.

2 - Verifique se o seu banco está no ar e se a URL de acesso está correta, faça uma simples classe de teste, com um Main, buscando a conexão e veja se a obtém corretamente. É um teste rápido, simples mas muito eficiente.

3 - Estas linhas: finally{ this.stmt.close(); this.con.close();
é onde é indicado a exceção, faça algo como:

finally{ 
            if(null != this.stmt)  
                 this.stmt.close();   
            if(null != this.con)
                  this.con.close();  

Afinal, está em um bloco finally onde você não garante que a variavél não venha a ser nula. Está fazendo assim, nesse caso.

this.null.close()

Entendeu? Fique atento a minha primeira dica.
Abraços.[/quote]

Realmente cara, o erro é desse tipo. Porém não reconhece o Driver JDBC do Mysql

E o erro que aparece na console encontrei apenas esse:

Falha na conexão com o Mysql! - No suitable driver found for jdbc:mysql://localhost/agenda

fiz apenas uma modificação no catch da classe de conexão

segue:

public class ConexaoMysql { public Connection getConexao() { try { return DriverManager.getConnection("jdbc:mysql://localhost/agenda", "root", ""); } catch(SQLException e) { System.out.println("Falha na conexão com o Mysql! - " + e.getMessage()); return null; } } }

O estranho é que, a Jar do mysql está la. Sempre clico com o botao direito no projeto, após, propriedades! Em bibliotecas, adiciono esse Jar (mysql-connector-java-5.1.13-bin.jar)

Ate exclui este e inseri dinovo pra notificar a certeza!

Mas o erro continua.

Fiz algo errado pra inserir essa JAR?

Espero ter sido Claro com a pergunta! E Valeu pela ajuda anterior.

Abraço.[/quote]

Oi!

Sim, é que faltou o Class.forName() no seu código, tente adicionar isso ao seu método getConexao() e veja o resultado, segue:

public class ConexaoMysql { public Connection getConexao() { try { //Carrega o driver Class.forName("com.mysql.jdbc.Driver"); return DriverManager.getConnection("jdbc:mysql://localhost/agenda", "root", ""); } catch(SQLException e) { System.out.println("Falha na conexão com o Mysql! - " + e.getMessage()); return null; } } }

No própiro GUJ tem um link que detalhe melhor o básico do JDBC ok?
Abraços.

Valeu brother, era isso mesmo. Eu não tinha carregado o Driver JDBC na minha classe. Sinceramente não fazia isso a tempos porque li na apostila que, a partir do JDBC 4 que vem no Java6, esse passo não é mais necessário.

E vou ler sim o link do GUJ sobre JDBC. Valeu cara.[RESOLVIDO]…HEHE

Abraço…