Exercício na Apostila VRaptor da Caelum [Resolvido]

Pessoal, como a maioria deve saber a Caelum disponibilizou em seu site o download da apostila do curso Web 2.0 com VRaptor, Hibernate e Ajax.

Aproveitando isso, vi uma chance de aprender algo novo e como estou aprendendo gostaria de saber se alguém está lendo esta apostila e poderia me ajudar ?

Na página 53, existe um desafio, onde tenho que buscar todas as musicas de um CD ao clicar num link na lista de CD’s.

Criei o seguinte método, mas que está dando erro e não sei decifrar este erro. Veja o método:

public void listaPorCd(Cd cd){
        this.musicas =  (List<Musica>) this.daoFactory.getMusicaDao().procura(cd.getId());
}

Alguém conseguiu fazer e poderia me dar a dica ?

Valew.

Qual é o erro? Posta ele pra ficar mais fácil de ajudar! Arriscando um palpite, vc criou o método getMusicas()?

Sim, criei o método getMúsicas, pois o listarTudo() está funcionando.

O erro:

javax.servlet.ServletException: modelo.Musica$$EnhancerByCGLIB$$c43550f5
	org.vraptor.VRaptorServlet.service(VRaptorServlet.java:82)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

Valew.

Vc colocou o Servlet do VRaptor no web.xml? Posta o stackTrace inteiro.

Coloquei sim!!! O sistema está funcionando normal, o problema é só neste método de listarPorCd().

erro inteiro:

exception 
javax.servlet.ServletException: modelo.Musica$$EnhancerByCGLIB$$55dd545a
	org.vraptor.VRaptorServlet.service(VRaptorServlet.java:82)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

root cause 
java.lang.ClassCastException: modelo.Musica$$EnhancerByCGLIB$$55dd545a
	logic.MusicaLogic.listaPorCd(MusicaLogic.java:58)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:585)
	org.vraptor.reflection.ReflectionUtil.invoke(ReflectionUtil.java:86)
	org.vraptor.reflection.JavaMethod.invoke(JavaMethod.java:31)
	org.vraptor.component.DefaultLogicMethod.execute(DefaultLogicMethod.java:122)
	org.vraptor.interceptor.ExecuteLogicInterceptor.intercept(ExecuteLogicInterceptor.java:40)
	org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	org.vraptor.interceptor.SettingAndValidationInterceptor.intercept(SettingAndValidationInterceptor.java:141)
	org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	org.vraptor.interceptor.InjectionInterceptor.intercept(InjectionInterceptor.java:45)
	org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	org.vraptor.interceptor.ComponentLookupInterceptor.intercept(ComponentLookupInterceptor.java:56)
	org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	logic.DaoInterceptor.intercept(DaoInterceptor.java:17)
	org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	org.vraptor.interceptor.RegisterAttributesInteceptor.intercept(RegisterAttributesInteceptor.java:57)
	org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	org.vraptor.core.VRaptorExecution.execute(VRaptorExecution.java:89)
	org.vraptor.core.VRaptorController.execute(VRaptorController.java:39)
	org.vraptor.VRaptorServlet.service(VRaptorServlet.java:57)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

Vc tem um método que intercepta esse getMusicasDao não é? Tenta colocar o código q ele utiliza na própria classe interceptada, só pra fazer um teste. Eu já tive problemas com o interceptor.

Mas, como a aplicação está rodando normalmente, com excessão do listaPorCd(), não conclui-se que o interceptor esteja normal ??

Caso vc ache q tenha q fazer esta mudança que vc sugeriu, teria como explicar melhor, por favor, pois não entendi nada !!! :oops:

Valew.

Onde eu posso achar todass as aqueles .jar da apostila?!?!?!

putz…to com o mesmo problema… não sei como resolver este desafio…

marceloplis, o seu erro está ocorrendo pois o método listaTudo do getMusicaDao pede uma música como argumento e você está tentando passar um cd…

alguém sabe por onde começar?! creio que a alteração deva ser feita apenas no MusicaLogic… mas não sei como colocar filtros para isto…

alguém já fez!??!

falou!

Resolvido:

Criar uma classe MusicaDao:

public class MusicaDao extends Dao<Musica>{

	//Construtor
	public MusicaDao (Session session){
		super(session, Musica.class);
	}
	
	//Metodos
	@SuppressWarnings("unchecked")
	public List<Musica> listaPorCd(Cd cd){
		List musicas = session.createCriteria(Musica.class)
			.add(Restrictions.eq("cd.id", cd.getId()))
			.list();
		return musicas;
	}
	
}

Alterar no DaoFactory o get do Dao da musica para:

public MusicaDao getMusicaDao(){
         return new MusicaDao(this.session);
}

Criar Action na MusicaLogic:

public void listaPorCd(Cd cd){
	this.musicas = this.daoFactory.getMusicaDao().listaPorCd(cd);
}

JSP listaPorCd.ok.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ taglib uri="http://displaytag.sf.net" prefix="display" %>

<!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=UTF-8">
	<link rel="stylesheet" type="text/css" href="css/style.css"/>
	<title>Lista de Músicas Por CD</title>
</head>
<body>
	<%@include file="../menu.jsp" %>
	<h1>Músicas</h1>
	<display:table id="musica" name="${musicas}" requestURI="musica.listaPorCd.logic">
		<display:column property="id"/>
		<display:column property="cd.titulo" sortable="true" title="CD"/>
		<display:column property="titulo"	 sortable="true"/>	
		<display:column property="preco"	 sortable="true"/>
		<display:column>
			<a href="musica.editar.logic?musica.id=${musica.id }">editar	</a>
		</display:column>	
		<display:column>
			<a href="musica.remove.logic?musica.id=${musica.id }">remover	</a>
		</display:column>
	</display:table>
</body>
</html>

Valew.