FJ-28-Problemas com o DaoInterceptor

8 respostas
patbuzzatto
seguinte estou resolvendo a apostila da Caelum Fj-28 e to parada na hora de inserir no banco pelo formulario.ok.jsp:
<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
	<title>Cadastro de Usuario</title>
	<link rel="stylesheet" type="text/css" href="css/style.css"/>
</head>
<body>

	<h1>Cadastro de usuarios</h1>
	
	<form action="usuario.adiciona.logic">
	
		Login: <input type="text" name="user.login" /> <br/>
		Senha: <input type="text" name="user.senha" /> <br/>
		<input type="submit">
	</form>
	
</body>
</html>
A lógica de inserção é esta UsuarioLogic:
package br.com.caelum.lojavirtual.loja;

import org.vraptor.annotations.Component;
import org.vraptor.annotations.InterceptedBy;
import org.vraptor.annotations.Out;
import org.vraptor.annotations.Parameter;

import br.com.caelum.lojavirtual.dao.Dao;
import br.com.caelum.lojavirtual.dao.DaoFactory;
import br.com.caelum.lojavirtual.modelo.Usuario;

@Component("usuario")
@InterceptedBy(DaoInterceptor.class)
public class UsuarioLogic {
	
		private DaoFactory daoFactory;
		
		@Parameter
		@Out
		public Usuario user = new Usuario();
		
		public UsuarioLogic(DaoFactory daoFactory){
			this.daoFactory = daoFactory;
		}
		
		public void adiciona (){
			//this.daoFactory.beginTransaction();
			System.out.println("Testando aki: "+user.getLogin());
			//this.daoFactory.getUsuarioDao().adiciona(user);
			//this.daoFactory.commit();
		}
		
		public void formulario(){
		}
	}

Observem as 3 linhas comentadas, o programa deveria funcionar com elas,
o DaoFactory deveria ser uma dependencia da minha classe e pra ele passar o algumento é o utilizado o DaoInterceptor.

Do jeito que eu escrevi o programa funciona lindo e inseri no banco, mas se eu tirar aqueles três comentarios pronto... ela da isso daqui:

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Transaction not successfully started
	org.vraptor.VRaptorServlet.service(VRaptorServlet.java:95)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

root cause

org.hibernate.TransactionException: Transaction not successfully started
	org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:131)
	br.com.caelum.lojavirtual.dao.DaoFactory.commit(DaoFactory.java:22)
	br.com.caelum.lojavirtual.loja.UsuarioLogic.adiciona(UsuarioLogic.java:30)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	java.lang.reflect.Method.invoke(Unknown Source)
	org.vraptor.component.DefaultLogicMethod.execute(DefaultLogicMethod.java:61)
	org.vraptor.interceptor.ExecuteLogicInterceptor.intercept(ExecuteLogicInterceptor.java:32)
	org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	org.vraptor.interceptor.SettingAndValidationInterceptor.intercept(SettingAndValidationInterceptor.java:131)
	org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	org.vraptor.interceptor.InjectionInterceptor.intercept(InjectionInterceptor.java:41)
	org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	org.vraptor.interceptor.ComponentLookupInterceptor.intercept(ComponentLookupInterceptor.java:58)
	org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	br.com.caelum.lojavirtual.loja.DaoInterceptor.intercept(DaoInterceptor.java:18)
	org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	org.vraptor.interceptor.FlashScopeInterceptor.intercept(FlashScopeInterceptor.java:22)
	org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	org.vraptor.interceptor.RegisterAttributesInteceptor.intercept(RegisterAttributesInteceptor.java:38)
	org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	org.vraptor.core.VRaptorExecution.execute(VRaptorExecution.java:98)
	org.vraptor.core.DefaultController.execute(DefaultController.java:46)
	org.vraptor.VRaptorServlet.service(VRaptorServlet.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.29 logs.
esse é meu DaoFactory:
package br.com.caelum.lojavirtual.dao;

import org.hibernate.*;

import br.com.caelum.lojavirtual.modelo.Usuario;
import br.com.caelum.lojavirtual.util.HibernateUtil;

public class DaoFactory {
	
	private final Session session;
	private Transaction transaction;
	
	public DaoFactory(){
		session = HibernateUtil.getSession();
	}
	
	public void beginTransaction() {
		this.transaction = this.session.beginTransaction();		
	}
	
	public void commit(){
		this.transaction.commit();
		this.transaction = null;
	}
	
	public boolean hasTransaction(){
		return this.transaction != null;
	}
	
	public void rollback(){
		this.transaction.rollback();
		this.transaction = null;
	}
	
	public void close(){
		this.session.close();
	}
	
	public Dao<Usuario> getUsuarioDao(){
		return new Dao<Usuario>(this.session, Usuario.class);
	}
	

}

e meu DaoInterceptor:

package br.com.caelum.lojavirtual.loja;


import org.vraptor.*;
import org.vraptor.annotations.Out;
import org.vraptor.view.ViewException;

import br.com.caelum.lojavirtual.dao.DaoFactory;

public class DaoInterceptor implements Interceptor {	
  
  @Out(key="br.com.caelum.lojavirtual.dao.DaoFactory")
  private DaoFactory factory = new DaoFactory();
	
	public void intercept(LogicFlow flow) throws LogicException, ViewException {
		
		//executa a logica
		flow.execute();
		
		
		//se sobrou transacao sem comitar, faz rollback
		if (factory.hasTransaction()){
			factory.rollback();
		}
		factory.close();
	}

}

Alguem pra ajudar? Pois ele abre o formulario mas na hora de cadastrar que ele falha.

8 Respostas

Lucas_Cavalcanti

sugiro que vc use a apostila nova do FJ-28, que usa o VRaptor 3:
http://www.caelum.com.br/curso/fj-28-vraptor-hibernate-ajax/

patbuzzatto

então eu mudei umas coisas que estavam na apostila pra poder usar o vraptor2 mas ainda continua falhando.
não tentei com o 3…

Lucas_Cavalcanti

se vc está começando do zero, comece do VRaptor 3, ele tem mais funcionalidades e é mais fácil de aprender e desenvolver com ele.

patbuzzatto

esse é o problema, não esta do zero não.
Eu olhei a apostila que voce falou tem muita coisa diferente, não compensa…

Lucas_Cavalcanti

você vai começar um novo projeto? ou dar manutenção num projeto já com vraptor 2?

tem muita coisa diferente mas é bem fácil de mudar, compensa sim. O VRaptor 2 não está mais sendo desenvolvido.
dá uma olhada nisso:
http://vraptor.caelum.com.br/documentacao/migrando-do-vraptor2-para-o-vraptor3/
e depois em
http://vraptor.caelum.com.br/documentacao/vraptor3-guia-de-1-minuto/
http://vraptor.caelum.com.br/documentacao/vraptor3-o-guia-inicial-de-10-minutos/

é tudo bem simples e fácil de aprender, vale a pena

A

Pode me explicar por gentileza o conceito de interceptador de DAO? Por que você não ultiza na Action? :smiley:

Lucas_Cavalcanti

no VRaptor 2 vc usava o DaoInterceptor pra criar e disponibilizar pras Actions o DAOFactory.

isso não faz mais sentido no VRaptor 3, já que vc pode usar injeção de dependências.

patbuzzatto

não tava querendo migra para o vraptor 3…
é por que as vezes eu tenho que trabalhar com uns projetos que não são meus.
Mas obrigada, vou tentar aprender também.

Criado 11 de fevereiro de 2011
Ultima resposta 14 de fev. de 2011
Respostas 8
Participantes 3