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.
@PersistenceCapablepublicclassPerson{@Persistent(primaryKey="true",valueStrategy=IdGeneratorStrategy.IDENTITY)privateLongid;@PersistentprivateStringname;@PersistentprivateStringemail;//getter and setters}
Ele ja vem com as configuracoes adequadas e jars apropriados para que o SecurityManager do GAE nao reclame.
abracos
G
garcia-jj
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.
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:
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?
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
garcia-jj
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.