<%@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>
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.
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.
