O vraptor nao le o meu controller!

Ola galera,

segue o meu codigo:

Controller


package br.com.arm.logic;





import java.util.List;

import br.com.arm.dao.DAO;
import br.com.arm.entities.Usuario;
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 br.com.caelum.vraptor.view.Results;

@Resource
public class UsuarioController {
	
	private DAO<Usuario> dao;
	private Result result;
	
	
	
	public UsuarioController(DAO<Usuario> dao, Res[/img]ult result) {
		this.dao = dao;
		this.result = result;
	}
	@Post
	@Path("/usuarios")
	public void adiciona (Usuario usuario){
		dao.adiciona(usuario);
		result.use(Results.logic()).redirectTo(UsuarioController.class).lista();
	}
	
	public void formulario() {
	}
	
	@Path("/usuarios")
	public List<Usuario> lista(){
		return dao.listaTudo();
	}

}

formulario.ok.jsp


<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
		<title>Cadastro de usuarios</title>
		<link rel="stylesheet" type="text/css" href="css/style.css"/>
	</head>
	<body>
		<h1>Cadastro de usuarios</h1>
		<form action=" <c:url value="/usuario/adiciona" />">
			Login: <input type="text" name="usuario.login" /><br/>
			Senha: <input type="text" name="usuario.senha" /><br/>
			<input type="submit" value="salvar"/>
		</form>
	</body>
</html>

quando eu clico em submit da seguinte erro:

HTTP Status 404 - /lojaVirtual2/usuario/adiciona

type Status report

message /lojaVirtual2/usuario/adiciona

description The requested resource (/lojaVirtual2/usuario/adiciona) is not available.
Apache Tomcat/6.0.13

Alguem sabe como me ajudar???

Obrigado

veja se vc alterou o web.xml desta forma:

&lt;context-param&gt; &lt;param-name&gt;br.com.caelum.vraptor.packages&lt;/param-name&gt; &lt;param-value&gt;br.com.arm.logic&lt;/param-value&gt; &lt;/context-param&gt;

Opa, a questão é o seguinte:

Não se pode utilizar Generics para dependency injection…

Retire o @Componente do seu Dao… Crie um UsuarioDao extends Dao… mude o construtor do seu controller para UsuarioDao no lugar de Dao, deverá funcionar…

[]'s

Galera segue meu codigo atualizado que continua dando o mesmo erro!
Agradeço se alguem puder me ajudar

Obrigado aos que ja postaram

Template dao:


package br.com.arm.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

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

@SuppressWarnings("unchecked")
public class DAO<T> {
	
	private Session session;
	private Class clazz;
	
	public DAO(Session session, Class clazz) {
		this.session = session;
		this.clazz = clazz;
	}
	
	public void adiciona(T t) {
		Transaction trans = this.session.beginTransaction();
		this.session.save(t);
		trans.commit();
		
	}
	
	public void remove (T t) {
		this.session.delete(t);
	}
	
	public void atualiza (T t) {
		this.session.merge(t);
	}
	
	public List<T> listaTudo() {
		return this.session.createCriteria(this.clazz).list();
	} 
	
	public T procura(Long id) {
		return (T) session.load(this.clazz, id);
	}


}

dao


package br.com.arm.dao;

import org.hibernate.Session;

import br.com.arm.entities.Usuario;
import br.com.caelum.vraptor.ioc.Component;

@Component
public class UsuarioDAO extends DAO<Usuario> {

	public UsuarioDAO(Session session, Class clazz) {
		super(session, clazz);
	}
	

	public void adcionaUsuario(Usuario usuario)
	{
		this.adiciona(usuario);
	}

}

Controller


package br.com.arm.logic;





import java.util.List;

import br.com.arm.dao.DAO;
import br.com.arm.dao.UsuarioDAO;
import br.com.arm.entities.Usuario;
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 br.com.caelum.vraptor.view.Results;

@Resource
public class UsuarioController {
	
	private UsuarioDAO dao;
	private Result result;
	
	
	
	public UsuarioController(UsuarioDAO dao, Result result) {
		this.dao = dao;
		this.result = result;
	}
	@Post
	@Path("/usuario")
	public void adiciona (Usuario usuario){
		dao.adiciona(usuario);
		result.use(Results.logic()).redirectTo(UsuarioController.class).lista();
	}
	
	public void formulario() {
	}
	
	@Path("/usuario")
	public List<Usuario> lista(){
		return dao.listaTudo();
	}

}

formulario.ok.jsp


<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
		<title>Cadastro de usuarios</title>
		<link rel="stylesheet" type="text/css" href="css/style.css"/>
	</head>
	<body>
		<h1>Cadastro de usuarios</h1>
		<form action=" <c:url value="/usuario/adiciona" />">
			Login: <input type="text" name="usuario.login" /><br/>
			Senha: <input type="text" name="usuario.senha" /><br/>
			<input type="submit" value="salvar"/>
		</form>
	</body>
</html>

web.xml


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<display-name>lojaVirtual2</display-name>

	<context-param>
		<param-name>br.com.caelum.vraptor.packages</param-name>
		<!-- Change this parameter to your app base package -->
		<param-value>br.com.arm</param-value>
	</context-param>

	<filter>
		<filter-name>vraptor</filter-name>
		<filter-class>br.com.caelum.vraptor.VRaptor</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>vraptor</filter-name>
		<url-pattern>/*</url-pattern>
		<dispatcher>FORWARD</dispatcher>
		<dispatcher>REQUEST</dispatcher>
	</filter-mapping>

	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
	</welcome-file-list>
</web-app>


Se alguem puder me ajudar eu agradeço

eu estou achando que é erro no tomcat!

Obrigado

Está dando o mesmo erro pois vc está recebendo um Class no construtor… Se vc pede pra o spring injetar uma Class, ele poderá injetar qualquer classe… então ele não saberá o que injetar… tente fazer o construtor assim:

        public UsuarioDAO(Session session) {
		super(session, Usuario.class);
	}

[]'s

Usar generics nos controllers dá mais problemas do que resultados. Já foi mais do que falado aqui no fórum sobre isso. Eu mesmo já havia levantado uma discução sobre o quão errado é você querer generalizar tudo que vê pela frente.

Alan, posta o stack trace que fica mais facil.

Tambem estou comecando com o Vraptor entao, se falar besteira me perdoem, mas reparei no seguinte:

Primeiro, o path para o metodo adiciona esta definido como @Path("/usuarios") e @Post.

      @Post  
      @Path("/usuarios")  
     public void adiciona (Usuario usuario){  
         dao.adiciona(usuario);  
         result.use(Results.logic()).redirectTo(UsuarioController.class).lista();  
     }  

Depois no action do form <c:url value="/usuario/adiciona" />, ele nao esta encontrando nenhum metodo para o @Path("/usuario/adiciona"), ja que foi redefinido para /usuarios. Alem do metodo estar definido como post no controller, mas no form esta como padrao, GET.

 <form action=" <c:url value="/usuario/adiciona" />">  
             Login: <input type="text" name="usuario.login" /><br/>  
             Senha: <input type="text" name="usuario.senha" /><br/>  
             <input type="submit" value="salvar"/>  
         </form>  

Como eu disse, sou novo no vRaptor e nao conheco os detalhes da implementacao do framework, talvez ele consiga de alguma forma contornar isso que eu coloquei aqui, mas foram as coisas que me chamaram a atencao.

De qualquer forma posta o stack trace que fica mais facil.

alanrmonteiro, há uma coisa que você não notou, e que talvez possa ser esse o erro. Na sua DAO estendida você está usando seu construtor assim:

Porém isso não é necessário, já que você quando estende sua classe já diz qual é a sua class através de extends DAO. Como o colega wariows já disse o vraptor faz injeção conforme o type, sendo assim ele não sabe o que colocar no parametro class. Afinal tudo no Java são class, então ele pode injetar qualquer coisa.

Altere seu construtor para isso:

public UsuarioDAO(Session session) { super(session); }

E na sua classe genérica faça assim:

public DAO(Session session) { final ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass(); entity = (Class<T>) (type).getActualTypeArguments()[0]; this.session = session; }

E altere seu atributo Class clazz para Class clazz.

Galera,

obrigado todo mundo pela atenção

bom, agora funcionou fiz duas coisas:

  1. no construtor do meu Dao eu alterei onde eu setava um argumento do tipo Class e coloque um Usuario.class
  2. retirei as anotações @Post @Path dos metodos do meu controller.

Bom, funcionou, mas ainda fiquei sem saber por que as anotações nos metodos do meu controller não funcionaram rssss, mas ja que funcionou deixa pra la

Obrigado a todos, a galera q posta aqui é muito gente boa

Valeu

Entao, Alan, quando voce tirou as anotacoes tudo funcionou porque as anotacoes estavam sobrescrevendo os padroes do vraptor, mas no seu form html, voce estava chamando as anotacoes padrao.

Veja: Seu form acessa a url “usuario/adiciona”, o vraptor entao procura uma classe chamada UsuarioController, anotada com @Resource e nela entao procura o metodo adiciona, voce tem que ter um UsuarioController.adiciona().

    <form action=" <c:url value="/usuario/adiciona" />">    
                Login: <input type="text" name="usuario.login" /><br/>    
                Senha: <input type="text" name="usuario.senha" /><br/>    
             <input type="submit" value="salvar"/>    
            </form>    

Repare tambem que voce nao definiu na sua tag form do html o elemento method, entao o form utiliza o padrao que é GET.

Mas na sua classe voce anotou o metodo adiciona com @Post, entao somente requisicoes com o method POST chegarao até o metodo adiciona(). Alem disso voce redefiniu, com a anotacao @Path, a url de acesso ao metodo para “/usuarios”, que agora deixou de ser o padrao (/, no seu caso “/usuario/adiciona/”) e passou a ser “/usuarios”, conforme voce definiu.

@Post @Path("/usuarios") public void adiciona (Usuario usuario){ dao.adiciona(usuario); result.use(Results.logic()).redirectTo(UsuarioController.class).lista(); }

Entao, ou voce tira as anotacoes ou voce redefine seu html para:

    <form action=" <c:url value="/usuarios" />" method="POST">    
                Login: <input type="text" name="usuario.login" /><br/>    
                Senha: <input type="text" name="usuario.senha" /><br/>    
             <input type="submit" value="salvar"/>    
            </form>    

alanrmonteiro posta aqui o código certo !