Problema/Dúvida: VRaptor3 + Google App Engine

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. :slight_smile:

Abaixo, segue o código.

[code]@PersistenceCapable
public class Person {

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

@Persistent private String name;

@Persistent private String email;

//getter and setters
}[/code]

<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>

[code]@Resource
public class PersonsController {

public void form () {

}

public void save (Person person) {
// esse objeto person esta sempre null!!!
}
//…
}[/code]

Abraços.

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

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

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?

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.

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$1545341940$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$1545341940$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$1545341940$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.

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$1545341940$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

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:

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.

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

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.

oi lenon!

convida o lucas tambem?

lucascs@gmail.com

abracos!

o email do gmail certo é: lucasmrtuner

[]s

Opa.

Está convidado, Lucas.

Abraços.