[RESOLVIDO] Problema na atividade 11.8 de struts 2 da apostila FJ-21 da Caelum

10 respostas
X

Eu fiz a atividade mas da um erro ao executar...

O código abaixo: class AdicionaTarefasAction:
package br.com.caelum.tarefas.action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;

import br.com.caelum.tarefas.dao.TarefaDAO;
import br.com.caelum.tarefas.modelo.Tarefa;

public class AdicionaTarefasAction {
	private Tarefa tarefa;

	@Action(value = "adicionaTarefa", results = { @Result(name = "ok", location = "/tarefa-adicionada.jsp") })
	public String execute() {
		new TarefaDAO().adiciona(tarefa);
		return "ok";
	}

	public void setTarefa(Tarefa tarefa) {
		this.tarefa = tarefa;
	}

	public Tarefa getTarefa() {
		return this.tarefa;
	}
}
TarefaDAO:
package br.com.caelum.tarefas.dao;

//Tem uns importes não utilizado pq apaguei uma parte do codigo... pois é de remove e etc

import java.sql.Connection;

import java.sql.Date;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.Calendar;

import java.util.List;



import br.com.caelum.tarefas.jdbc.ConnectionFactory;

import br.com.caelum.tarefas.modelo.Tarefa;



public class TarefaDAO {

	Connection connection;

	

	public TarefaDAO(){

		this.connection = new ConnectionFactory().getConnection();

	}

	

	public void adiciona(Tarefa tarefa){

		String sql = "insert into tarefas (descricao) " +

					"values (?)";

		

		try{

			PreparedStatement stmt = this.connection.prepareStatement(sql);

			stmt.setString(1, tarefa.getDescricao());

			

			stmt.execute();

			stmt.close();

		}catch (SQLException e){

			throw new RuntimeException (e);

		}

	}

	

}
class ConnectionFactory?
package br.com.caelum.tarefas.jdbc;
import java.sql.*;
public class ConnectionFactory {
	public Connection getConnection(){
		System.out.println("Conectando ao Banco de Dados...");
		
		String stringDeConexao="jdbc:mysql://localhost/banco";
		String user="root";
		String pass="";
		
		try{
			return DriverManager.getConnection
			(stringDeConexao,user,pass);
		}catch(SQLException e){
			throw new RuntimeException(e+"\nNAO FOI POSSIVEL CONECTAR NO BANCO DE DADOS");
		}
	}
}
Pagina web:
<html>
	<head>
		<title>.:Tarefas:.</title>
	</head>
<body>
	<h3>Adicionar tarefas</h3>
	<form action="adicionaTarefa" method="post">
		Descrição: <br />
		<textarea name="tarefa.descricao" rows="5" cols="100"></textarea>
		<br /> <input type="submit" value="Adicionar">
	</form>
</body>
</html>

O erro é esse:

java.lang.RuntimeException: java.sql.SQLException: Field 'finalizado' doesn't have a default value
	br.com.caelum.tarefas.dao.TarefaDAO.adiciona(TarefaDAO.java:33)
	br.com.caelum.tarefas.action.AdicionaTarefasAction.execute(AdicionaTarefasAction.java:14)
	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:138)
	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:270)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
	com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
	com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)
	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:498)
	org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
	org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)

Eu coloquei o pacote do meu projeto no SkyDriver:
https://skydrive.live.com/redir.aspx?cid=d6b369f16014e7e3&resid=D6B369F16014E7E3!126

10 Respostas

A

Opa, boa tarde …

A sua tabela tarefas tem um campo finalizado ??

Esse campo é obrigatório ?

Tenta setar um valor para esse atributo no objeto tarefa, ou, defina um valor padrão para ele no banco de dados

[]'s

X
alex.brito:
Opa, boa tarde ...

A sua tabela tarefas tem um campo finalizado ??

Esse campo é obrigatório ?

Tenta setar um valor para esse atributo no objeto tarefa, ou, defina um valor padrão para ele no banco de dados

[]'s

Cara eu já tentei definir um valor padrão, mais o MySQL diz que não posso:

Erro
consulta SQL:

ALTER TABLE `tarefas` CHANGE `finalizado` `finalizado` TINYINT( 10 ) NOT NULL DEFAULT CURRENT_TIMESTAMP

Mensagens do MySQL : Documentação
#1067 - Invalid default value for 'finalizado'

Eu foi no campo coloquei em editar e lá tem um atributo (não sei o nome, é uma característica pro campo) que é padrão então colquei todas as opções e todas dá esse erro...

Não sei se o campo finalizado é obrigatório, na apostila não diz... :S

leoramos

Se o tipo do campo é tinyint, não tem como colocar o default como current_timestamp. Tens que definir um tipo compatível.

X

tem 3 tipos
null , current_timestamp e as defined todos dão erro.

Como faço então??

A

Esse campo finalizado não é uma flag ??? voce pode adotar 0 e 1 para false e true …

[]'s

A

E voce declara ele com 1 posição.

Ex:

ALTER TABLE `tarefas` CHANGE `finalizado` `finalizado` TINYINT( 1 ) NOT NULL DEFAULT 0

[]'s

X

alex.brito:
E voce declara ele com 1 posição.

Ex:

ALTER TABLE `tarefas` CHANGE `finalizado` `finalizado` TINYINT( 1 ) NOT NULL DEFAULT 0

[]'s

Deu certo… mais agora o problema ta com o campo data:

java.lang.RuntimeException: java.sql.SQLException: Field 'dataFinalizacao' doesn't have a default value br.com.caelum.tarefas.dao.TarefaDAO.adiciona(TarefaDAO.java:33) br.com.caelum.tarefas.action.AdicionaTarefasAction.execute(AdicionaTarefasAction.java:14) 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)

como faço pra colocar default nele??

X

Eu coloquei o tipo do campo timestamp ai deu certo o default… Mas tem algum problema eu tirar Date para timestamp??

A

Na verdade não, basicamente um campo Date armazena somente a data e um Timestamp armazena Data e Hora …

[]'s

X

OK
VLW!!

[RESOLVIDO]

Criado 27 de outubro de 2011
Ultima resposta 27 de out. de 2011
Respostas 10
Participantes 3