REST + VRaptor?

Pessoal na documentação fala um pouco de REST, eu estou tentando usar mais não ta dando muito certo, segue o código:

package br.com.caelum.vraptor.global.controller;
import br.com.caelum.vraptor.Delete;
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.Put;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.global.dao.UsuariosDao;
import br.com.caelum.vraptor.global.interceptor.UsuariosInfo;
import br.com.caelum.vraptor.global.model.Usuarios;
import br.com.caelum.vraptor.view.Results;

@Resource
public class UsuariosController {

    private final Validator validator;
    private final Result result;
    private final UsuariosInfo UsuariosInfo;
    private final UsuariosDao dao;                     // seta o dao

              public UsuariosController(UsuariosDao dao, UsuariosInfo UsuariosInfo,
                                                 Result result, Validator validator) {
		this.dao = dao;
		this.result = result;
		this.validator = validator;
                    this.UsuariosInfo = UsuariosInfo;
	}
	@Path("/usuarios") //Lista usuarios
	@Get
	public void lista() {
          List<Usuarios> Usuarios = new ArrayList<Usuarios>();
          result.include("Usuarios", Usuarios);
    }
          
          @Path("/usuarios") //Adiciona usuarios
	@Post
          public void adiciona(Usuarios usuarios){
          dao.adiciona(usuarios);
          result.use(Results.logic()).redirectTo(UsuariosController.class).lista();
     }
          @Path("/usuarios/{produto.id}") //visualiza usuarios
	@Get
	public void vizualiza(Usuarios Usuarios) {
	this.dao.refresh(Usuarios);
	result.include("Usuarios", Usuarios);
	}
 /**
          @Put
          @Path("/{usuarios.id/{usuarios.id}")
          public void atualiza(Usuarios Usuarios) {.
                  
         ..}
          
          @Delete
          @Path("/usuarios/{usuarios.id}")
          public void remove(Usuarios usuarios) {...}
*/
          public void formulario() {
          // povoa campos
         }
}

Hmm, e há alguma mensagem de erro? Está dando algum erro ou você tem alguma dúvida? O que exatamente você precisa?

Abraços

Amigão eu inicie do 0, fazendo tudo passo a passo seguindo a documentação … na duvida posto aqui… se persistir. ja bugou 4 crud e nada! risos.

Eu só não entendi muito bem a sua dúvida. Qual o erro que deu ao executar esse código?

quando eu descomentava dava erro ! esse codigo embaixo !

#  /** 
#           @Put 
#           @Path("/{usuarios.id/{usuarios.id}") 
#           public void atualiza(Usuarios Usuarios) {. 
#                    
#          ..} 
#            
#           @Delete 
#           @Path("/usuarios/{usuarios.id}") 
#           public void remove(Usuarios usuarios) {...} 
# */  

E qual o erro?

deletei tudo estou fazendo tudo novamente !

cuidado com erros de digitação:

 @Put  
           @Path("/{usuarios.id/{usuarios.id}")  
           public void atualiza(Usuarios Usuarios) {.  
                     
          ..}  

dê uma olhada:

@Path("/{usuarios.id/{usuarios.id}")  

o certo seria algo do tipo:

@Path("/usuarios/{usuarios.id}")  

e o parâmetro do método tem que ter o mesmo nome (maiusculas e minusculas fazem diferença):

public void atualiza(Usuarios usuarios) {.  

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;
              }

        
}

	



    

   
    



<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<fmt:setLocale value="${locale}"/>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<form action="<c:url value="/usuarios/adiciona"/>">
    Id:.    &lt;input type="text" name="usuarios.id" /&gt;<br/>
    Nome:.    &lt;input type="text" name="usuarios.nome" /&gt;<br/>
    Login:.            &lt;input type="text" name="usuarios.logn" /&gt;<br/>
    Password:.            &lt;input type="text" name="usuarios.password" /&gt;<br/>
&lt;input type="submit" value="Salvar" /&gt;
&lt;/form&gt;
&lt;/head&gt;

&lt;/html&gt;

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.

Abraços

Junior, você precisa ler melhor as exceptions.

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

package br.com.caelum.vraptor.global.provider;
import br.com.caelum.vraptor.ComponentRegistry;
import br.com.caelum.vraptor.ioc.spring.SpringProvider;
import br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor;
import br.com.caelum.vraptor.util.hibernate.SessionCreator;
import br.com.caelum.vraptor.util.hibernate.SessionFactoryCreator;
public class CustomProvider extends SpringProvider {
	@Override
	protected void registerCustomComponents(ComponentRegistry registry) {
		registry.register(SessionCreator.class, SessionCreator.class);
		registry.register(SessionFactoryCreator.class, SessionFactoryCreator.class);
		registry.register(HibernateTransactionInterceptor.class, HibernateTransactionInterceptor.class);
	}

}


package br.com.caelum.vraptor.global.controller;
//import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.ComponentFactory;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

//@Component
public class SessionCreator implements ComponentFactory&lt;Session&gt; {

    private final SessionFactory factory;
    private Session session;

    public SessionCreator(SessionFactory factory) {
        this.factory = factory;
    }

    @PostConstruct
    public void create() {
        this.session = factory.openSession();
    }

    public Session getInstance() {
        return session;
    }

    @PreDestroy
    public void destroy() {
        this.session.close();
    }

}
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
                            session.save(usuarios);
              //result.usuarios(Results.logic()).redirectTo(UsuariosController.class).lista();
              }
              @Post
              public void delete(Usuarios usuarios) {
                            session.delete(usuarios);
              }
              @Post
              public void edita(Usuarios usuarios){
                            session.merge(usuarios);
              }

             

        
}

	



    

   
    



// 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&lt;Usuarios&gt; lista() {
            return new ArrayList&lt;Usuarios&gt;();
      }
          @Path("/usuarios/adiciona")
	@Post
          public void adiciona(Usuarios usuarios) {
                    this.dao.adiciona(usuarios);
}
          public void formulario() { 
                        
      }

}


apague as classes CustomProvider e SessionCreator (e SessionFactoryCreator se vc tiver também) e coloque essa configuração no web.xml

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

se já tiver uma com o mesmo nome (provavelmente apontando pro custom provider) apague-a

ainda tá dando o mesmo erro?

erro :

HTTP Status 500 -

type Exception report

message

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

interface org.hibernate.validator.Validator

vc importou a classe errada… o certo eh br.com.caelum.vraptor.Validator…

tome cuidado: quase tudo que está na documentação do vraptor é pra ser importado das classes do vraptor

[]

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

Não daria conflito com endereços iguais?

não é só:

~/produtos -- conseguiria a listagem de produtos 
~/produtos -- adiciona 

é:

GET   ~/produtos -- conseguiria a listagem de produtos 
POST ~/produtos -- adiciona 

o método http muda… assim a gente consegue fazer mais de uma operação com a mesma URL