Problema/Dúvida: VRaptor3 + Google App Engine

13 respostas
lgi2020

Prezados,

Já tentei um bocado mas não obtive sucesso.

Estou tentando fazer uma aplicação básica (CRUD) com VRaptor 3 na estrutura do Google App Engine.
Meu problema está quando tento salvar uma entidade a partir de dados de um form.

Acho que o VRaptor não está conseguindo instanciar e popular as propriedades da entidade em questão.
E isso só acontece se a aplicação estiver na App Engine.
Se eu instanciar e setar as propriedades manualmente funciona sem problemas.

Se alguém tiver alguma idéia ou enxergar algo que eu esteja fazendo de errado, por favor, dê uma luz. :)

Abaixo, segue o código.
@PersistenceCapable
public class Person {

	@Persistent(primaryKey="true", valueStrategy = IdGeneratorStrategy.IDENTITY) 
	private Long id;
	
	@Persistent private String name;
	
	@Persistent private String email;

//getter and setters
}
<form action="<c:url value="/persons/save"/>" method="post">
    		Nome: 		<input type="text" name="person.name" />		<br/>
    		E-mail:		<input type="text" name="person.email" />	<br/>
    					<input type="submit" value="Salvar" />
		</form>
@Resource
public class PersonsController {

public void form () {
	
	}

public void save (Person person) {
// esse objeto person esta sempre null!!!
}
//...
}

Abraços.

13 Respostas

Paulo_Silveira

Ola Lennon!

Voce utilizou o blank-project do GAE que o vraptor ja disponibiliza? Olhe aqui:
http://code.google.com/p/vraptor3/downloads/list

Ele ja vem com as configuracoes adequadas e jars apropriados para que o SecurityManager do GAE nao reclame.

abracos

G

Como você está compilando e empacotando a aplicação para enviar ao GAE?

Note que o vraptor3 usa o paranamer para saber o nome dos parametros para injeção dos valores. Se você compilar sem a opção de debug o paranamer não consegue saber o nome dos atributos do método e consecutivamente ele não consegue popular os valores.

Paulo, será que pode ser proposto uma alternativa a isso? Por exemplo uma annotation opcional como tinha a @Logic(parameters=“foo”) no vraptor2? No meu caso como minha app é comercial envio os fontes sem opções de debug.

Abraços

Paulo_Silveira

Oi Garcia! é uma boa… mas lembre-se que a opcao de debug mode já é default de todas as principais IDEs e não tem custo de performance pra aplicação, alem de te livrar de mais anotacoes :). Mas realmente precisamos. nao quer colocar a issue pra gente no github?

lgi2020

Paulo,

Eu já estava utilizando o blank-project do link que você indicou.
De qualquer forma, comecei a refazer do zero e parece que agora funcionou ok.

Acho que de tanto mexer no projeto para encontrar a solução para o problema que tive ontem acabei ferrando com alguma coisa.

Obrigado pela ajuda.

lgi2020

Caros amigos…

Continuo tomando uma meia dúzia de tocos com estes meus testes.
Tenho conseguido resolver alguns…
Porém, o problema da vez já tá me enervando. :frowning:

Tenho um controller: PersonsController.
Tenho um método list() neste controller.
Se eu fizer acesso direto à url do método (/persons/list), tudo funciona em paz.
Contudo, ao tentar fazer um redirecionamento para este mesmo método através de um Result recebo uma página em branco e no log uma exceção.

Código de redirecionamento:

Exceção:

javax.servlet.ServletException: java.lang.RuntimeException: java.lang.ClassNotFoundException: PersonsController$list$[telefone removido]$2 at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:240) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139) at org.mortbay.jetty.Server.handle(Server.java:313) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506) at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:830) at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381) at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:139) at com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java:239) at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:5135) at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:5133) at com.google.net.rpc.impl.BlockingApplicationHandler.handleRequest(BlockingApplicationHandler.java:24) at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:363) at com.google.net.rpc.impl.Server$2.run(Server.java:814) at com.google.tracing.LocalTraceSpanRunnable.run(LocalTraceSpanRunnable.java:56) at com.google.tracing.LocalTraceSpanBuilder.internalContinueSpan(LocalTraceSpanBuilder.java:516) at com.google.net.rpc.impl.Server.startRpc(Server.java:769) at com.google.net.rpc.impl.Server.processRequest(Server.java:351) at com.google.net.rpc.impl.ServerConnection.messageReceived(ServerConnection.java:437) at com.google.net.rpc.impl.RpcConnection.parseMessages(RpcConnection.java:319) at com.google.net.rpc.impl.RpcConnection.dataReceived(RpcConnection.java:290) at com.google.net.async.Connection.handleReadEvent(Connection.java:436) at com.google.net.async.EventDispatcher.processNetworkEvents(EventDispatcher.java:762) at com.google.net.async.EventDispatcher.internalLoop(EventDispatcher.java:207) at com.google.net.async.EventDispatcher.loop(EventDispatcher.java:101) at com.google.net.rpc.RpcService.runUntilServerShutdown(RpcService.java:251) at com.google.apphosting.runtime.JavaRuntime$RpcRunnable.run(JavaRuntime.java:396) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: PersonsController$list$[telefone removido]$2 at com.google.apphosting.runtime.jetty.SessionManager.deserialize(SessionManager.java:389) at com.google.apphosting.runtime.jetty.SessionManager.loadSession(SessionManager.java:307) at com.google.apphosting.runtime.jetty.SessionManager.getSession(SessionManager.java:282) at org.mortbay.jetty.servlet.AbstractSessionManager.getHttpSession(AbstractSessionManager.java:237) at org.mortbay.jetty.Request.getSession(Request.java:998) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:192) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:238) ... 27 more Caused by: java.lang.ClassNotFoundException: PersonsController$list$[telefone removido]$2 at com.google.appengine.runtime.Request.process-260731df5c3104a8(Request.java) at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source) at java.io.ObjectInputStream.readClassDesc(Unknown Source) at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) at java.io.ObjectInputStream.readObject0(Unknown Source) at java.io.ObjectInputStream.readObject(Unknown Source) at java.util.HashMap.readObject(Unknown Source) at sun.reflect.GeneratedMethodAccessor14.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at java.io.ObjectStreamClass.invokeReadObject(Unknown Source) at java.io.ObjectInputStream.readSerialData(Unknown Source) at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) at java.io.ObjectInputStream.readObject0(Unknown Source) at java.io.ObjectInputStream.defaultReadFields(Unknown Source) at java.io.ObjectInputStream.readSerialData(Unknown Source) at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) at java.io.ObjectInputStream.readObject0(Unknown Source) at java.io.ObjectInputStream.readObject(Unknown Source) at com.google.apphosting.runtime.jetty.SessionManager.deserialize(SessionManager.java:385) ... 35 more

Alguma idéia para ajudar um cidadão desesperado como eu?

Abraços.

Lucas_Cavalcanti

Tenta acessar 2 vezes esse método (sem derrubar a aplicação) que está dando problema, e vê se o nome da classe que tá dando ClassNotFound é o mesmo…

o nome vai ser algo do tipo:
PersonsController$list$[telefone removido]$2

o que vc tem que ver é se os números da frente são diferentes…

se isso estiver acontecendo, receba no construtor da sua lógica um TypeCreator, e imprime de algum jeito a classe do objeto que veio:

public class XController {
       public XController(TypeCreator creator) {
          System.out.println(creator.getClass());
      }
}

a classe que tem que vir é a CacheBasedTypeCreator, se não for ela me diz, q eu tento ver outras possibilidades

[]'sw

Paulo_Silveira

Oi Lennon

Dessa forma que o Lucas falou, voce ajuda a gente a descobrir esse possivel bug. Engracado que estamos rodando varias aplicacoes no GAE sem problemas… mas cloud ainda é uma caixinha de supresas nao? :slight_smile:

lgi2020

Obrigado pelas respostas.

Ainda não tive a oportunidade de testar por causa do trabalho…

Assim que chegar em casa farei os testes sugeridos e posto o resultado.

Abraços.

G

Paulo, cadastro sim. Chegando em casa crio uma conta lá e adiciono a issue.

Como minha aplicação é comercial, para evitar engenharia reversa (ou pelo menos dificultar) os fontes irão para o cliente ofuscados. Sendo assim eu vou perder todos os nomes de atributos. Por isso minha sugestão.

Abraços

lgi2020

Prezados,

Fiz uns testes.

O nome da classe no log é o mesmo sempre.

A classe que retorna no construtor é br.com.caelum.vraptor.reflection.CacheBasedTypeCreator.

Paulo,

Achei um e-mail (gmail) seu na net e mandei um invite para acessar a aplicação.

Abraços.

Paulo_Silveira

oi lenon!

convida o lucas tambem?

[email removido]

abracos!

Lucas_Cavalcanti

o email do gmail certo é: lucasmrtuner

[]s

lgi2020

Opa.

Está convidado, Lucas.

Abraços.

Criado 14 de outubro de 2009
Ultima resposta 16 de out. de 2009
Respostas 13
Participantes 4