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…
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);
}
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.
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.
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.
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().
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: