Dei uma parada para ler a Documentação ontem, e percebi que pode-se usar tanto o Hibernante quanto REST…
Refiz todo meu código : Mesmo Assim Nada Funciona !
ficou assim :
// 12 JANEIRO DE 2010 - SISTEMA GLOBAL WEB
package br.com.caelum.vraptor.global.controller;
import java.util.ArrayList;
import java.util.List;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import org.hibernate.validator.Validator;
import br.com.caelum.vraptor.global.dao.UsuariosDao;
import br.com.caelum.vraptor.global.model.Usuarios;
@Resource
public class UsuariosController { //classes publica
private UsuariosDao dao;
private Result result;
private Validator validator;
public UsuariosController(UsuariosDao dao, Result result, Validator validator) {
this.dao = dao; // seta o Dao
this.result = result; // seta o Result
this.validator = validator;
}
@Path("/usuarios/{usuarios.id}")
@Get
public List<Usuarios> lista() {
return new ArrayList<Usuarios>();
}
@Path("/usuarios/{usuarios.id}")
@Get
public List<Usuarios> listaTodos() {
return new ArrayList<Usuarios>();
}
@Path("/usuarios/adiciona")
@Post
public void adiciona(Usuarios usuarios) {
this.dao.adiciona(usuarios);
}
public void formulario() {
}
}
package br.com.caelum.vraptor.global.model;
import java.io.Serializable;
import javax.persistence.Id;
import br.com.caelum.vraptor.ioc.Component;
import javax.persistence.GeneratedValue;
@Component
public class Usuarios implements Serializable {
@Id
//@NotNull
@GeneratedValue
private Long id;
private String login;
private String nome;
private String password;
/**
* @return the id
*/
public Long getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(Long id) {
this.id = id;
}
/**
* @return the login
*/
public String getLogin() {
return login;
}
/**
* @param login the login to set
*/
public void setLogin(String login) {
this.login = login;
}
/**
* @return the password
*/
public String getPassword() {
return password;
}
/**
* @param password the password to set
*/
public void setPassword(String password) {
this.password = password;
}
/**
* @return the nome
*/
public String getNome() {
return nome;
}
/**
* @param nome the nome to set
*/
public void setNome(String nome) {
this.nome = nome;
}
}
package br.com.caelum.vraptor.global.dao;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.global.model.Usuarios;
import br.com.caelum.vraptor.ioc.Component;
import org.hibernate.Session;
@Component
public class UsuariosDao {
private Session session;
public UsuariosDao(Session session) {
this.session = session;
}
@Post
public void adiciona(Usuarios usuarios) { // salva usuarios
getSession().save(usuarios);
// result.use(Results.logic()).redirectTo(UsuariosController.class).lista();
}
@Post
public void delete(Usuarios usuarios) {
getSession().delete(usuarios);
}
@Post
public void edita(Usuarios usuarios){
getSession().merge(usuarios);
}
/**
* @return the session
*/
public Session getSession() {
return session;
}
/**
* @param session the session to set
*/
public void setSession(Session session) {
this.session = session;
}
}
Junior, uma coisa você sempre tem que ter em mente: o vraptor é um controlador e o Hibernate é um datamapper. Um não tem nada a ver com o outro. O fato de você usar Hibernate não impacta em nada no Vraptor.
Mas quanto ao seu problema, eu já havia comentado em outro tópico, e reitero aqui. Note a exception:
Você possui dois métodos respondendo para um mesmo URI, onde o correto é ter apenas um. A anotação @Path com o parametro /usuarios/{usuarios.id} está tando no método lista como no listaTodos. Isso não pode acontecer, o URI tem que ser único.
Além disso você precisa entender melhor como funciona o bind dos valores que vem do request. Quando você usar {usuarios.id} no @Path o vraptor vai procurar no seu método um objeto com o nome usuarios e nele vai tentar injetar o atributo id. No seu caso você não tem em nenhum dos métodos o atributo usuarios.
Desculpe se não consegui te explicar direito, estou com um pouco de pressa agora. Mas sinta-se a vontade de questionar se você não entendeu.
Nesse caso você tem dois candidatos a injeção de Session: org.hibernate.Session e br.com.caelum.vraptor.global.controller.SessionCreator.
Não sei bem como funciona essas configurações de Hibernate dentro do vraptor, pois não uso assim. Acho que o Lucas pode te ajudar melhor. De qualquer forma, me diga como você está criando/injetando/usando a Session do Hibernate?
se vc criou a classe br.com.caelum.vraptor.global.controller.SessionCreator na sua aplicação, remova-a ou tire a anotação @Component dela, que deve funcionar
descriptionThe server encountered an internal error () that prevented it from fulfilling this request.
exception
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘usuariosController’ defined in file [/home/junior/global/build/web/WEB-INF/classes/br/com/caelum/vraptor/global/controller/UsuariosController.class]: Unsatisfied dependency expressed through constructor argument with index 2 of type [org.hibernate.validator.Validator]: : No unique bean of type [org.hibernate.validator.Validator] is defined: Unsatisfied dependency of type [interface org.hibernate.validator.Validator]: expected at least 1 matching bean; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [org.hibernate.validator.Validator] is defined: Unsatisfied dependency of type [interface org.hibernate.validator.Validator]: expected at least 1 matching bean
note The full stack traces of the exception and its root causes are available in the GlassFish v3 logs.
GlassFish v3
Eu ainda não entendi qual seria a uri nos casos que seguem, da classe controladora de produtos que está logo abaixo.
public class ProdutosController {
//… @Get@Path("/produtos")
public List lista() {…} @Post("/produtos")
public void adiciona(Produto produto) {…} @Get("/produtos/{produto.id}")
public void visualiza(Produto produto) {…} @Put("/produtos/{produto.id}")
public void atualiza(Produto produto) {…} @Delete("/produtos/{produto.id}")
public void remove(Produto produto) {…}
}
Seria
~/produtos – conseguiria a listagem de produtos
~/produtos – adiciona