Hibernate + VRaptor, entidades anotadas

Olá Pessoal

Estou com o seguinte problema:
No meu web.xml estou usando um provider do VRaptor para me fornecer uma session do hibernate

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

E nas minhas entidades/classes modelo, estou anotando-as com @Entity

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import br.com.caelum.vraptor.ioc.Component;

@Component
@Entity
public class Usuario {	
	@Id
	@GeneratedValue
	private Long idUsuario;
	
	@Column(length=70)
	private String nome;
}

Eu preciso no meu hibernate.cfg.xml fazer isto ?

<mapping class="br.com.nextrans.erp.modelo.Usuario" />

Acredito que não!
Só que devo estar errando em algum lugar, porque minha aplicação não roda quando inicio o tomcat
Aparece o erro 404

Se eu fosse fazer na mão a session eu teria que fazer algo assim, certo ?

public class HibernateUtil {
private static SessionFactory factory;
static {
AnnotationConfiguration cfg = new AnnotationConfiguration();
cfg.addAnnotatedClass(Usuario.class);
factory = cfg.buildSessionFactory();
}
public Session getSession() {
return factory.openSession();
}
}

Eu preciso seguir alguma convenção pro vraptor saber o que eu quero ?
É legal eu pegar uma session do VRaptor ?

Desde já agradeço

Bom dia,

Você ta anotando a classe Controller com o @Resource?

Abs,

Estou sim Henrique

Hm, então coloca sua estrutura de pacotes e o código do seu controller aqui.

Abs.

O Controller

package br.com.nextrans.erp.controller;

import java.util.List;

import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.nextrans.erp.dao.UsuarioDAO;
import br.com.nextrans.erp.modelo.Usuario;

@Resource
public class UsuarioController {
	
	private Result r;
	private UsuarioDAO dao;
	
	public UsuarioController(Result r, UsuarioDAO dao) {
		this.r = r;
		this.dao = dao;
	}
	
	@Get("/usuario")
	public void index(){
		this.r.redirectTo(this).list();
	}
	
	public void home(){
		
	}
	
	public void adiciona(){
		
	}
	
	@Post
	public void adiciona(Usuario usuario){
		this.dao.adiciona(usuario);
		this.r.redirectTo(this).list();
	}
	
	@Get
	public List<Usuario> list(){
		return this.dao.lista();
	}	
}

A Estrutura dos pacotes, só estas aí de cima já bastam ?

Cara pelo seu código do controller tá tudo certinho.
Você tem a classe UsuarioController e digamos que quer acessar o index. Pela convenção do vraptor você deve ter uma pagina index.jsp dentro da pasta WEB-INF/jsp/index
Assim ao acessar http://localhost:8080/aplicacao/usuario/index o vraptor acessa sua classe UsuarioController e chama a pagina jsp com o nome do método acessado, no caso index.

Você criou a pagina .jsp com o caminho correto?
Abracao

Sim cara, esta tudo certo.
Estava funcionando normalmente antes. Só que estava com a seguinte config no hibernate.cfg.xml

Ai fui criar o modelo Grupo e tal, criei DAO, Controller, as pastas dentro de WEB-INF/jsp, tudo certo.
Só que quando fui testar, já não estava funcionando mais.
Já voltei o projeto pro estado anterior e nada também
Deletei o projeto, recriei mudando de nome, e nada também

No log aparece as seguintes linhas

09:54:29  INFO [Environment         ] hibernate.properties not found
09:54:29  INFO [Environment         ] Bytecode provider name : javassist
09:54:29  INFO [Environment         ] using JDK 1.4 java.sql.Timestamp handling
09:54:30  INFO [Version             ] Hibernate Commons Annotations 3.2.0.Final
09:54:30  INFO [Configuration       ] configuring from resource: /hibernate.cfg.xml
09:54:30  INFO [Configuration       ] Configuration resource: /hibernate.cfg.xml
09:54:30  INFO [Configuration       ] Configured SessionFactory: null

Configured SessionFactory: null ? Será que é por isso o erro ?

Pelo que verifiquei nos codigos acima, existe dois erros…

Primeiro: Corrigir a maneira como gerar um Session, na propria documentacao do VRaptor existe um tutorial de como criar tanto uma SessionFactory (Hibernate) como uma EntityFactory (JPA)

Segundo: Nao se coloca a anotacao @Component em classes modelos, pois o @Component é usado para instanciar objetos por injecao de dependencia que o VRaptor realiza, geralmente nos projetos que trabalhei utilizavamos o @Component para classes do tipo DAO, SessionFactorys e outros objetos cuja suas funcionalidades sejam utilizadas com muita frequencia utilizando uma unica instancia, é um pouco parecido como criar objetos Singletons só que a diferença é que no VRaptor vc pode definir o escopo de instancia desses componentes, seja escopo durante uma requisicao @RequestScoped (cada acesso uma instancia nova do componente), por sessao de usuario @SessionScoped (uma instancia criada por sessao de usuario), por cada requisicao criada @PrototypeScoped e por aplicacao @ApplicationScoped (iniciou o projeto, ja eh liberado uma unica instancia sendo compartilhada para todo mundo).

Enfim, remova o @Component da classe Usuario e segue o link para se criar uma SessionFactory no VRaptor de maneira eficiente:

http://vraptor.caelum.com.br/documentacao/componentes/ um pouco abaixo tem um exemplo pronto de uma SessionFactory chamada de SessionCreator.

ligue o log de debug do VRaptor e veja se na inicialização ele está listando as urls… algo assim:

..... /usuario    br.com......UsuarioController.index()

só note que se vc colocou @Get("/usuario") vc vai acessar com http://localhost:8080//usuario

Ok Caio, vou tentar isso.

Lucas, como eu ligo esse log ?

Valeu

colocando esse arquivo numa source folder: https://github.com/caelum/vraptor/blob/master/vraptor-blank-project/src/log4j.xml

Valeu !

Então, eu coloquei e ele lista corretamente as urls

14:08:49,058 DEBUG [DefaultParametersControl] For /usuario retrieved /usuario with {}
14:08:49,059  INFO [DefaultRouteBuilder ] /usuario                                          [GET] -> UsuarioController.index()
14:08:49,061 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for UsuarioController.list() as []
14:08:49,061 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for UsuarioController.list() as []
14:08:49,061 DEBUG [DefaultParametersControl] For /usuario/list retrieved /usuario/list with {}
14:08:49,062  INFO [DefaultRouteBuilder ] /usuario/list                                     [GET] -> UsuarioController.list()
14:08:49,062 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for UsuarioController.home() as []
14:08:49,062 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for UsuarioController.home() as []
14:08:49,063 DEBUG [DefaultParametersControl] For /usuario/home retrieved /usuario/home with {}
14:08:49,063  INFO [DefaultRouteBuilder ] /usuario/home                                     [GET] -> UsuarioController.home()
14:08:49,064 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for UsuarioController.adiciona() as []
14:08:49,064 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for UsuarioController.adiciona() as []
14:08:49,064 DEBUG [DefaultParametersControl] For /usuario/adiciona retrieved /usuario/adiciona with {}
14:08:49,064  INFO [DefaultRouteBuilder ] /usuario/adiciona                                 [GET] -> UsuarioController.adiciona()
14:08:49,075 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for UsuarioController.adiciona(Usuario) as [usuario]
14:08:49,076 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for UsuarioController.adiciona(Usuario) as [usuario]
14:08:49,076 DEBUG [DefaultParametersControl] For /usuario/adiciona retrieved /usuario/adiciona with {}
14:08:49,076  INFO [DefaultRouteBuilder ] /usuario/adiciona                                 [POST] -> UsuarioController.adiciona(Usuario)
14:08:49,077 DEBUG [StereotypedBeansRegistrar] scanning class br.com.nextrans.erp.dao.UsuarioDAO
14:08:49,077 DEBUG [StereotypedBeansRegistrar] scanning class br.com.nextrans.erp.controller.LoginController
14:08:49,078 DEBUG [ResourceHandler     ] Found resource: class br.com.nextrans.erp.controller.LoginController
14:08:49,078 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for LoginController.login() as []
14:08:49,079 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for LoginController.login() as []
14:08:49,079 DEBUG [DefaultParametersControl] For /login retrieved /login with {}
14:08:49,079  INFO [DefaultRouteBuilder ] /login                                            [GET] -> LoginController.login()
14:08:49,080 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for LoginController.login() as []
14:08:49,080 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for LoginController.login() as []
14:08:49,080 DEBUG [DefaultParametersControl] For / retrieved / with {}
14:08:49,081  INFO [DefaultRouteBuilder ] /                                                 [GET] -> LoginController.login()
14:08:49,082 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for LoginController.login(Usuario) as [usuario]
14:08:49,082 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for LoginController.login(Usuario) as [usuario]
14:08:49,082 DEBUG [DefaultParametersControl] For /login retrieved /login with {}
14:08:49,083  INFO [DefaultRouteBuilder ] /login                                            [POST] -> LoginController.login(Usuario)
14:08:49,083 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for LoginController.logout() as []
14:08:49,084 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for LoginController.logout() as []
14:08:49,084 DEBUG [DefaultParametersControl] For /logout retrieved /logout with {}
14:08:49,084  INFO [DefaultRouteBuilder ] /logout                                           [GET] -> LoginController.logout()
14:08:49,085 DEBUG [StereotypedBeansRegistrar] scanning class br.com.nextrans.erp.interceptor.LoginInterceptor
14:08:49,085 DEBUG [InterceptorStereotypeHandler] Found interceptor for class br.com.nextrans.erp.interceptor.LoginInterceptor
14:08:49,085 DEBUG [StereotypedBeansRegistrar] scanning class br.com.caelum.vraptor.util.hibernate.SessionFactoryCreator
14:08:49,085 DEBUG [StereotypedBeansRegistrar] scanning class br.com.nextrans.erp.session.UsuarioSession
14:08:49,086 DEBUG [StereotypedBeansRegistrar] scanning class br.com.caelum.vraptor.util.hibernate.SessionCreator
14:08:49,088  INFO [VRaptor             ] VRaptor 3.3.1 successfuly initialized

vc está chamando a url correta? com o contexto correto?

quando vc chama a url aparece mais algo no log?

Caio, fiz o que me falou mas não resolveu ainda cara.
Alguma outra ideia ?

Lucas, estou sim.
Chamo assim http://localhost:8080/erpNextrans/login

E não aparece nada no log, só no browser que fica o erro 404, mas, até ai, não ajuda muito.

se não aparece nada no log, então não tá caindo na aplicação… como vc configurou esse nome de contexto?

O nome do contexto seria o display-name no web.xml ?
Se for, lá ta assim

Encontrei está linha no log

WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:erpNextrans' did not find a matching property.

não…

se vc usa o eclipse geralmente é o nome do projeto…

se vc tá fazendo deploy via war, é o nome do war

se vc fez o projeto em cima do blank-project, é possível que seja vraptor-blank-project