VRaptor 3

Sempre gostei muito do VRaptor e seus conceitos…

Nunca tive oportunidade de trabalhar com ele em um projeto de verdade.
Atualmente, com a nova versão (VRaptor 3), retomei meus estudos em horas vagas.

Tive um probleminha para testar a combinação VRaptor3 + Google Application Engine + Google Application Engine Eclipse Plugin.

A partir do blank-project-gae do vraptor, segui as instruções do readme e “upei” o projeto para a estrutura da Google.

Até aí, sem problemas…

Mas, ao tentar persistir uma entidade devidamente anotada como persistente, recebia a exceção a seguir:

org.datanucleus.jdo.exceptions.ClassNotPersistenceCapableException: The class "The class "br.com.caelum.vraptor.blank.Aluno" is not persistable. This means that it either hasnt been enhanced, or that the enhanced version of the file is not in the CLASSPATH (or is hidden by an unenhanced version), or the Meta-Data/annotations for the class are not found." is not persistable. This means that it either hasnt been enhanced, or that the enhanced version of the file is not in the CLASSPATH (or is hidden by an unenhanced version), or the Meta-Data for the class is not found.

Lendo melhor a documentação do AppEngine, descobri que as entidades anotadas devem passar por um processo denominado Enhanced.

Esse processo estava funcionando normalmente, através do plugin do eclipse, em uma outra aplicação sem o VRaptor.

Depois de algumas horas batendo cabeça e tendo que dividir minha atenção entre o trabalho e a diversão (testar o VRaptor no GAE), resolvi tentar utilizar o ANT para compilar o projeto e fazer o Enhanced.

Funcionou perfeitamente.
Agora, voltarei a “brincar” com meu projetinho VRaptor3 no GAE.

Não sei se o que me atrapalhou foi um problema ou um caso de B.I.O.S…
Mas fica a dica pra se alguém passar pelo mesmo.

No mais, ficam meus parabéns a toda a equipe por trás do VRaptor 3.

Link sobre como utilizar o ANT para compilar o projeto:
http://code.google.com/intl/pt-BR/appengine/docs/java/tools/ant.html#The_Complete_Build_File

Abraços a todos.

Oi lgi2020.

Isso pode ser resolvido de uma forma facil: basta criar o arquivo de configuração do JDO(jdoconfig.xml)

<?xml version="1.0" encoding="utf-8"?>
<jdoconfig xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig">

	<persistence-manager-factory name="transactions-optional">
		<property name="javax.jdo.PersistenceManagerFactoryClass"
			value="org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManagerFactory" />
		<property name="javax.jdo.option.ConnectionURL" value="appengine" />
		<property name="javax.jdo.option.NontransactionalRead" value="true" />
		<property name="javax.jdo.option.NontransactionalWrite"
			value="true" />
		<property name="javax.jdo.option.RetainValues" value="true" />
		<property name="datanucleus.appengine.autoCreateDatastoreTxns"
			value="true" />
	</persistence-manager-factory>
</jdoconfig>

[]s,

Pessoal,

Fiz o FJ-21 na Caelum, tivemos VRaptor3, e depois de um ano estou pensando em utilizá-lo a vera em um projeto. Antes estou brincando pra adquirir a confiança necessária. Bem… baixei a apostila do FJ-28 que a Caelum disponibilizou e vi lá o exemplo da página 100, onde é feita uma busca de produtos por nome, até aí tudo bem. Até que resolvi fazer uma graça e criar uma busca com vários parâmetros, e surgiu uma dúvida de baixo nível: Como o VRaptor reconhece os parâmetros corretamente se o Java não guarda no bytecode o nome dos parâmetros quando compilado em modo não debug? Viajei? :?

[]s

o VRaptor usa um framework chamado Paranamer que lê as informações de debug e recupera os nomes dos parâmetros (tem uma citação a isso na apostila, em algum lugar).

se a classe não for compilada em modo de debug o VRaptor não consegue fazer a mágica completa, mas usa o nome da classe com a primeira minúscula.

Valeu, Lucas.

Se não entendi errado, isso significa que um código que estava funcionando em modo debug pode parar de funcionar após compilá-lo em modo não debug? Considerando que a propriedade “name” do meu INPUT seja “searchExpression” e ele passe isso para o servidor via GET ou POST, chegando lá, como o VRaptor conseguiria bater o nome do parâmetro do request “searchExpression” com o nome do parâmetro do meu método “string” ?

Caso o meu parâmetro seja um tipo primitivo como “int” ou “boolean”, ele vai fazer o inverso, ou seja, colocar a primeira maiúscula?
E se existir mais de um parâmetro do mesmo tipo ele acrescenta um contador “string1”, “string2”… ?

Dei um search na apostila e encontrei o trecho que ele faz essa menção ao Paranamer, que cita inclusive a possibilidade de utilizar pré-compilação para obter esses nomes. Esse processamento pré-compilação é automático ou eu deveria fazer algum procedimento na IDE ou no código para habilitá-lo?

Abraços e mais uma vez obrigado pela disponibilidade

[quote=fabianorodrigo]Valeu, Lucas.

Se não entendi errado, isso significa que um código que estava funcionando em modo debug pode parar de funcionar após compilá-lo em modo não debug?
[/quote]
Em 99.9% dos casos vc não vai ter problemas em compilar o código em modo debug, geralmente não é uma restrição (e o ant, maven, eclipse, javac compilam
em modo debug por padrão). A menos que vc precise explicitamente que não tenha debug, não se preocupe com isso.

ele não vai conseguir bater, vai parar de funcionar mesmo.

int vai virar “int”, boolean vai virar "boolean… e ele não vai diferenciar por números os parâmetros

não lembro de cabeça, mas tem na documentação do paranamer… provavelmente é um parâmetro que vc configura na compilação (na IDE, ant, etc)

vc tá perguntando isso por curiosidade, ou vc não pode de jeito nenhum compilar o código em debug?

A princípio é mera curiosidade, essa compreensão da lógica de funcionamento do framework facilita o aprendizado. Mas também pensando no caso de no futuro precisar compilar em modo não debug.
Mais uma vez obrigado

se vc precisa rodar em modo não debug vc pode usar a anotação @Named:

@Path("/abc")
public void abc(@Named("xuxu") String xuxu) {..}

Show de bola!