[Resolvido] SessionFactory e Hibernate Session do Vraptor

6 respostas
bglbruno

Olá pessoal !

Estou com dúvida sobre como usar os componentes utilitários opcionais do Vraptor de Hibernate Session e Session Factory.
Nesta página http://vraptor.caelum.com.br/documentacao/componentes-utilitarios-opcionais/ diz que eu tenho que colocar no meu arquivo web.xml o seguinte trecho

<context-param>
    <param-name>br.com.caelum.vraptor.provider</param-name>
    <param-value>br.com.caelum.vraptor.util.hibernate.HibernateCustomProvider</param-value>
</context-param>

Já o fiz.

Tenho uma classe HibernateUtil, que antes criava a session factory e devolvia uma session por meio de um método pra quem precisasse.
A minha dúvida é nessa classe ! Como eu faço para utilizar a Session ou Session factory que o Vraptor me disponibiliza ?

Desde já agradeço pela atenção

6 Respostas

Lucas_Cavalcanti

agora vc não precisa do HibernateUtil… vc só precisa receber a Session no construtor da classe em que vc quer usá-lo
(desde que ela esteja anotada com alguma das anotações do VRaptor, tipo @Resource, @Component, @Intercepts, etc)

bglbruno

Certo Lucas, Valeu !

Mas, agora tem outro problema.

Estou recebendo em minha classe usuarioDAO uma Hibernate Session

Minha classe UsuarioDAO está da seguinte maneira:

@Component
public class UsuarioDAO {
	private Session session;

	public UsuarioDAO(Session session) {
		this.session = session;
	}

	public Usuario autentica(Usuario usuario) {
		Usuario u = null;
		try {
			u = (Usuario) this.session.createQuery("FROM Usuario WHERE email = :email AND senha = :senha").setString("email", usuario.getEmail()).setString("senha", usuario.getSenha()).uniqueResult();
		} catch (Exception e) {
			System.err.println(e.getMessage());
		}
		return  u;
	}
}

E minha classe loginController

@Resource
public class LoginController {

	private Result r;
	private UsuarioDAO usuarioDAO;
	private UsuarioSession usuarioSession;

	public LoginController(Result r, UsuarioDAO usuarioDAO,
			UsuarioSession usuarioSession) {
		this.r = r;
		this.usuarioDAO = usuarioDAO;
		this.usuarioSession = usuarioSession;
	}

	@Get
	@Path({"/login", "/"})
	public void login() {

	}

	@Post
	@Path("/login")
	public void login(Usuario usuario) {
		try{
			Usuario autenticando = usuarioDAO.autentica(usuario);
			
			if(autenticando.getSenha().equals(usuario.getSenha())){
				
				this.usuarioSession.setUsuario(autenticando);
				r.redirectTo(UsuarioController.class).home();
				
			}else{
				
				r.include("erroLogin", "Dados inválidos!");
				r.redirectTo(LoginController.class).login();
				
			}
		}catch (Exception e) {
			
			r.include("erroLogin", "Desculpe. Tente mais tarde.");
			r.redirectTo(LoginController.class).login();
			
		}
	}
}

Quando tento fazer login o seguinte log é apresentado

16:20:15,774 DEBUG [VRaptor             ] VRaptor received a new request
16:20:15,791 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor
16:20:15,791 DEBUG [DefaultResourceTranslator] trying to access /login
16:20:15,793 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: LoginController.loginLoginController.login(Usuario)]
16:20:15,944 DEBUG [LazyInterceptorHandler] Invoking interceptor ParametersInstantiatorInterceptor
16:20:15,954 DEBUG [JstlLocalization    ] couldn't find message bundle, creating an empty one
16:20:15,955 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for LoginController.login(Usuario) as [usuario]
16:20:16,000 DEBUG [OgnlParametersProvider] Applying senha with [210491]
16:20:16,067 DEBUG [OgnlParametersProvider] Applying email with [[email removido]]
16:20:16,068 DEBUG [ParametersInstantiatorInterceptor] Parameter values for [DefaultResourceMethod: LoginController.loginLoginController.login(Usuario)] are [br.com.nextrans.erp.modelo.Usuario@fa7181]
16:20:16,069 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InstantiateInterceptor
16:20:16,074 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor
16:20:16,076 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExceptionHandlerInterceptor
16:20:16,081 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor HibernateTransactionInterceptor
16:20:16,084 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor
16:20:16,084 DEBUG [ExecuteMethodInterceptor] Invoking LoginController.login(Usuario)
null
16:20:16,098 DEBUG [DefaultLogicResult  ] redirecting to class LoginController
16:20:16,331 DEBUG [DefaultLogicResult  ] redirecting to /erpNextrans/login
16:20:16,333 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ForwardToDefaultViewInterceptor
16:20:16,333 DEBUG [ForwardToDefaultViewInterceptor] Request already dispatched and commited somewhere else, not forwarding.
16:20:16,513 DEBUG [VRaptor             ] VRaptor ended the request
16:20:16,516 DEBUG [VRaptor             ] VRaptor received a new request
16:20:16,523 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor
16:20:16,524 DEBUG [DefaultResourceTranslator] trying to access /login
16:20:16,524 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: LoginController.loginLoginController.login()]
16:20:16,526 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InstantiateInterceptor
16:20:16,534 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor
16:20:16,537 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExceptionHandlerInterceptor
16:20:16,549 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor HibernateTransactionInterceptor
16:20:16,551 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor
16:20:16,551 DEBUG [ExecuteMethodInterceptor] Invoking LoginController.login()
16:20:16,552 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ForwardToDefaultViewInterceptor
16:20:16,552 DEBUG [ForwardToDefaultViewInterceptor] forwarding to the dafault page for this logic
16:20:16,558 DEBUG [DefaultPageResult   ] forwarding to /WEB-INF/jsp/login/login.jsp
16:20:16,558 DEBUG [DefaultStaticContentHandler] Deferring request to container: /erpNextrans/WEB-INF/jsp/login/login.jsp 
16:20:16,754 DEBUG [VRaptor             ] VRaptor ended the request

O que estou fazendo de errado ?

Desde já agradeço

Lucas_Cavalcanti

qual é o erro? o que (não) está acontecendo?

bglbruno

Desculpe.

O Problema é que parece que este metodo não executa a query.

public Usuario autentica(Usuario usuario) {  
        Usuario u = null;  
        try {  
            u = (Usuario) this.session.createQuery("FROM Usuario WHERE email = :email AND senha = :senha").setString("email", usuario.getEmail()).setString("senha", usuario.getSenha()).uniqueResult();  
        } catch (Exception e) {  
            System.err.println(e.getMessage());  
        }  
        return  u;  
}

Fazendo com que caia no catch deste outro metodo

@Post  
    @Path("/login")  
    public void login(Usuario usuario) {  
        try{  
            Usuario autenticando = usuarioDAO.autentica(usuario);  
              
            if(autenticando.getSenha().equals(usuario.getSenha())){  
                  
                this.usuarioSession.setUsuario(autenticando);  
                r.redirectTo(UsuarioController.class).home();  
                  
            }else{  
                  
                r.include("erroLogin", "Dados inválidos!");  
                r.redirectTo(LoginController.class).login();  
                  
            }  
        }catch (Exception e) {  
              
            r.include("erroLogin", "Desculpe. Tente mais tarde.");  
            r.redirectTo(LoginController.class).login();  
              
        }  
    }

Pelo log eu acho que ele faz a requisição corretamente, a execução chega até o metodo autentica, mas retorna null

Será que estou fazendo algo de errado com a Session que estou recebendo no construtor da UsuarioDAO ?

Lucas_Cavalcanti

tenta ver se tá entrando no dao…

a query vai retornar null se não existir um usuario com o email e a senha que vc passou

bglbruno

Então cara, o e-mail e senha estavam corretos.
E a execução chegando no DAO

O Engraçado é que agora quando fui executar rodou normal, fez login.
Existe algum cache ou coisa do tipo ?

De qualquer maneira, muito obrigado pela ajuda !
Forte abraço.

Criado 17 de julho de 2011
Ultima resposta 18 de jul. de 2011
Respostas 6
Participantes 2