Dúvida VRaptor -> Representation

Boa noite,

Estou estudando o vRaptor através da apostila FJ-28 da caelum, e achei a parte que fala de Representation meio vago, não entendi direito como usar, se algum puder ajudar.

Estou em dúvida nessa parte:

dai tenho meu autocomplete assim:

                                                                $("#busca").autocomplete(
								'<c:url value="/produtos/busca.json"/>',
								{
									dataType : "json",
									parse : function(produtos) {
										return $.map(produtos,
												function(produto) {
													return {
														data : produto,
														value : produto.nome,
														result : produto.nome
													};
												});
									},
									formatItem : function(produto) {
										return produto.nome + "("
												+ produto.preco + ")";
									}
								});

que antes chamava este método

@Get("/produtos/busca.json")
	public void buscaJson(String q) {
		result.use(Results.json()).withoutRoot().from(dao.busca(q))
				.exclude("id", "descricao").serialize();
	}

A dúvida é, o que exatamente tenho q mudar para que o autocomplete consiga receber o json? Como informar o content type?

Vlw

o representation é pra quando vc está usando REST, com um HttpClient onde vc consegue adicionar o header Accept com o tipo de representação que vc quer (ex. xml, json ou html)

o que vc quer está descrito aqui:
http://jqueryui.com/autocomplete/#remote-jsonp

clique em view source. Só troque o dataType pra json, e adapte o resto dos parametros do $.ajax pro que o controller espera receber. na função do success vc monta o result partir dos dados da lista

Ah valeu cara,

eu alterei o código assim dai voltou funcionar o autocomplete

$("#busca").autocomplete(
								'<c:url value="/produtos/busca?_format=json"/>',  // com o _format eu aviso que quero um json de volta
								{
									dataType : "json",
									parse : function(produtos) {
										
										produtos =  JSON.parse(JSON.stringify(produtos.list)); // e aqui eu tiro a raiz do json, creio que fosse possível formatar embaixo isso, mas ainda não manjo mto de javascript =/
								
										return $.map(produtos,
												function(produto) {
													return {
														data : produto,
														value : produto.nome,
														result : produto.nome
													};
												});
									},
									formatItem : function(produto) {
										return produto.nome + "("
												+ produto.preco + ")";
									}
								});   

Agora to com outro problema, a busca normal q usa esse mesmo controle, porém retornando direto pra página não funciona, existe algum jeito de eu saber exatamente o nome da váriavel que o vraptor retorna?

por exemplo, esse método:

public void busca(String q) {
		result.include("nome", q);
		result.use(Results.representation())
		.from(dao.busca(q))
		.exclude("id", "descricao")
		.serialize();
		System.out.println(q);
		}

retorna o que para o jsp? ${produtos}, ${produto}, ${produtosList} ?

valeu!

se vc usar o .from(dao.busca(q), “produtos”)… vai ser ${produtos}

então, eu começo digita no campo dai o autocomplete encontra e mostra as opçoes, dai eu pressiono Enter, ele vai pra respectiva jsp, porém eu tento apresentar os dados com ${produtos.nome}, e não aparece nada =/

alguma sugestão?

vlw

se dao.busca(q) retorna uma lista, vc deveria iterar por ela, usando o <c:forEach

Ah, agora sim. Falha minha.

É que durante os testes ontem acabei tirando o segundo parametro do .from, dai não conseguia acha a váriavel, (agora deixei produtoList pra reutiliza a outra jsp que eu ja tenho pra listagem).
PS. Nesse caso deixando só “.from(dao.busca(q))” ele retornaria a variavel com qual nome?

public void busca(String q) {
		result.include("nome", q);
		result.use(Results.representation())
		.from(dao.busca(q), "produtoList")
		//.exclude("id", "descricao")
		.serialize();
		System.out.println(q);
		}

E finalmente só re-corrigindo o autocomplete ficou assim

$("#busca").autocomplete(
								//'<c:url value="/produtos/busca.json"/>',
								{
								
									dataType : "json",
									parse : function(produtos) {
										
										produtos =  JSON.parse(JSON.stringify(produtos.produtoList));
								
										return $.map(produtos,
												function(produto) {
													return {
														data : produto,
														value : produto.nome,
														result : produto.nome
													};
												});
									},
									formatItem : function(produto) {
										return produto.nome + "("
												+ produto.preco + ")";
									}
								});   

Vlw, pelo apoio/paciência.

até;

se vc não fala nada, o VRaptor usa o nome da classe do objeto que vc passou.

se vc passa um Produto, o nome da variavel como ${produto}, e o VRaptor faz isso com produto.getClass() pra pegar o nome da classe,

numa List, apesar da gente ver esse , se vc faz lista.getClass() ele retorna só List, então a variável vai ser só ${list}

entendi, vlw novamente =)

Sou novata em Java e VRaptor e estou estudando a apostila Desenv. Ágil para Web com VRaptor, Hibernate e AJAX.

Gostaria do exemplo completo do uso do método representation() no tópico 12.7. Lá na apostila só mostra o código do método busca no controller. Gostaria de saber o que devo atualizar no código de header.jsp e busca.jsp.

Olá,

o representation() foi feito principalmente para se você está se comunicando com a aplicação sem ser com forms e links em um browser. Funciona tanto em chamadas ajax, como outros sistemas chamando o seu via HTTP.

Mas ele aceita HTML como representação também, então usar um form ou link normal também vai mostrar a página, desde que haja o JSP do método.

Conhece o livro de VRaptor? ele explica esse tipo de coisa com mais detalhes que a apostila:
http://www.casadocodigo.com.br/products/livro-vraptor

Obrigada Lucas, vou ver o livro para ir mais a fundo. Outro ponto, pensei que no curso fj-28 abordasse DAO genérica na implementação do exemplo, mas até esse ponto da minha leitura não foi feito e acho que não faz. No livro de VRaptor explica como se implementa DAO genérica com VRaptor?

Não aborda, porque não considero DAO genérica como uma boa prática. Ele força que todas as entidades possuam todas as operações do CRUD, o que nem sempre é verdade. Algumas não podem ser alteradas, outras não podem ser removidas, etc…

Mas se vc criar a DAO genérica e receber no construtor de uma classe DAO, ele vai injetar pra você normalmente.

se você tiver classes filhas de DAO, vc precisa que o DAO não seja @Component, mas só as filhas sejam.

Lucas,

Já havia lido algo a respeito sobre o uso de DAO genérica no caso da entidade não usar todas as operações do CRUD. Vou repensar o uso de DAO genérica no meu trabalho…

Não uso o framework Spring nas minhas aplicações. Na aplicação da apostila estamos controlando as transações manualmente, abrindo e fechando-as dentro de alguns métodos do DAO. Mas se precisar fazer mais de uma operação dentro da mesma transação, como alterar o código da aplicação da apostila para permitir o controle desse tipo de transação. Você teria um exemplo de como deveria ficar o código da aplicação goodbuy?

Resumindo, qual seria a melhor forma de tratar transações com VRaptor para quem não usa Spring e não vai ter o Transaction Manager para controlar todas as transações de uma aplicação.

você pode usar o plugin vraptor-jpa ou vraptor-hibernate, que cuidam das transações pra você automaticamente, iniciando e commitando as transações a cada request.

assim vc só recebe o EntityManager ou Session no construtor dos DAOS e não precisa das ComponentFactories que criam eles.


Obrigada pela dica. Vou usar então o plug-in vraptor-hibernate.

Comecei a testar o framework Velocity e logo de início no “Olá Mundo” levei um erro… Estou usando o VRaptor 3.5.1, o hibernate-distribution-3.6.4.Final e o Tomcat 7. Conforme solicitado na apostila do curso, baixei os zips velocity-1.7.zip e velocity-tools-2.0.zip (últimas versões). No velocity-1.7.zip copiei os jars velocity-1.7.jar e velocity-1.7-dep.jar. No velocity-tools-2.0.zip copie todos os jars da pasta lib. Seguem em anexo as imagens das bibliotecas instaladas no classpath do projeto, a configuração do Velocity feita no arquivo web.xml e a mensagem de erro recebida incluindo o trace do console quando executo http://localhost:�8083/goodbuy/olamundo.vm.

Estou com alguma incompatibilidade nas libraries? O que significa a mensagem de erro “java.lang.ClassNotFoundException: org.apache.velocity.tools.view.servlet.VelocityViewServlet”?

tenta usar o velocity-tools 1.7 tb…

usar versões diferentes da mesma lib pode causar esse tipo de erro.

Lucas,

Usei o velocity-1.4.zip e o velocity-tools-1.4.zip, porque não existia o velocity-tools-1.7, e funcionou…

Baixei o vraptor-hibernate-vraptor3.zip do repositório https://github.com/caelum/vraptor-hibernate, pois no projeto goodbuy estava usando Hibernate 3.6.4. Como eu instalo o plug-in vraptor-hibernate no projeto goodbuy?

Qual a diferença entre os plug-in vraptor-hibernate-vraptor3.zip e vraptor-hibernate-vraptor-3.5.3.zip existentes no https://github.com/caelum/vraptor-hibernate?

Estou querendo usar versões mais atuais nas tecnologias usadas nos meus futuros sites. Quais versões não dão problema de compatibilidade e você sugere usar para:
? Hibernate - JBoss
? VRaptor - Caelum
? JSTL - Sun
? Tomcat - Apache
? MySQL - Sun
? JQuery - JQuery

para VRaptor 3.x e hibernate 3.6.x, use o plugin vraptor-hibernate na versão 1.0.0

para VRaptor 4.x e hibernate 4.x, use o plugin vraptor-hibernate na versão mais nova, 4.0.0.Final

e para instalar o plugin, é só colocar o jar dele na pasta WEB-INF/lib, de preferência usando o maven ou outro gerenciador de dependencias pra fazer isso.

Se tá começando agora, sugiro começar com o VRaptor 4, Hibernate 4, que precisam do tomcat 7+

todas as outras bibliotecas que você listou vc pode usar qualquer versão, de preferência as últimas.

Estou com uma dúvida com relação ao uso do vraptor-hibernate no código do goodbuy.

Além de não precisar mais da classe CriadorDeSessionFactory, entendi que também não é mais necessária a classe CriadorDeSession, pois com o plugin do vraptor-hibernate uma Session é automaticamente aberta ao início da requisição e fechada ao final, bem como uma transação é aberta ao início da requisição e feito o commit ou rollback dela ao final.

Resumindo, para usar o componente, deleto as classes CriadorDeSessionFactory e CriadorDeSession, bastando então receber a Session no construtor do componente desejado e retirar as linhas com “Transaction tx = session.beginTransaction();” e “tx.commit();” dos métodos do componente. Estou certa?