SmartGwt - RPC e DataSource

Olá pessoal,

Estou desenvolvendo uma aplicação web utilizando smartGwt.
Depois de apanhar muito, eu consegui montar meu projeto no eclipse, faze-lo rodar no tomcat e buscar dados via RPC(Remote Procedure Call) no lado server da aplicação, que está rodando com hibernate e hsqldb.
Caso alguém tenha alguma dúvida bem básica até esse ponto talvez eu possa ajudar.

Mas estou com algumas dúvidas, gostaria de ouvir a opinião de vocês sobre elas:

1º) Tenho um conhecido que já desenvolveu algumas aplicações bem grandes utilizando ext-gwt, ele me disse que pra obter um bom desempenho em aplicações gwt é preciso tomar um certo cuidado com os objetos que são transferidos via RPC, pois os objetos utilizados no lado client terão de ser convertidos para javascript, e dependendo de como estivér a coisa isso pode gerar arquivos js gigantescos que demorariam muito para ser carregados no browser. Ele aconselhou utilizar umas espécie de dto(Data Transfer Object), que seriam objetos mais simples, contendo apenas informações necessárias e tipos mais básicos. Eu estava pensando em utilizar nas chamadas RPC apenas objetos JSON, o que vocês acham?! Daria muito mais trabalho, ficaria performático?!
Alguém teria outras sugestões?!
Ou no fim das contas eu só estou falando um monte de besteiras e deveria transferir diretamente meus TOs sem medo?

Acredito que essa dúvida deve servir tanto pra quem usa smartGwt, como ext-gwt,gwt puro ou qualquer outra extensão.

2º) No showcase do smartGwt, notei que a maioria dos grids e outros componentes são populados utilizando DataSource, porém os dados provêm de arquivos .xml e não de um banco de dados propriamente dito. Até então eu só consegui popular um grid por exemplo criando records diretamente e adicionando um a um no grid.
Ex:

ListGrid listGrid = new ListGrid();
ListGridRecord record = new ListGridRecord();
record.setAttribute("itemID", 1);
record.setAttribute("itemNome", "Batata");
listGrid.addData(record);

Estou fazendo muita besteira?! Será que alguém pode me mostrar algum outro caminho melhor ou mais “correto” para popular os componentes do smartGwt e enviar de volta dados para serem gravados na camada de persistência.

Acho que é isso ai, qualquer exemplo ou sugestão é válido.

Obrigado desde já!

Boa tarde.

Infelizmente não vou te dar a melhor prática pra fazer isso. Estou alguns passo atrás de ti ainda, eu nem consigo me conectar usando o SmartGWT. Não consigo entender onde implementar as classes, client, server…Poderia me Ajudar? Poderia me passar sua estrutura de pastas para eu poder entender como funciona? Estou tentando primeiramente com MySql…sem sucesso!

Agradeço desde já!

Ola!

Se você está utilizando alguma versão paga do smartGwt não saberei te ajudar, pois existem vários mecanismos que foram desenvolvidos para facilitar a persistência de dados, comunicação com o lado server, etc. Por sinal, dizem que é muito bom, mas eu não tive oportunidade de testar.

No meu caso, utilizo a versão gratuita, que consiste basicamente dos componentes visuais utilizados do lado client da aplicação. Portanto o resto é o mesmo mecanismo do GWT. Recomendo que você de uma estudada melhor no GWT, e principalmente na parte de comunicação client/server através de RPC(Remote Procedure Call).
Você irá encontrar muito material sobre o GWT na própria documentação oficial. http://code.google.com/intl/en/webtoolkit/doc/latest/tutorial/

Entendendo a estrutura das aplicações GWT fica fácil utilizar o lado client do smartGWT, todo o código do showcase do smartGWT está disponível junto aos arquivos que você baixa junto com o .jar, por ali da para entender bastante coisa.

Até+!

entao talles

  1. Acho que nao tem muito com oq se preocupar por que o compilador do GWT facilita a vida… faz o melhor js possivel pra ti

  2. Sobre o popular o grid, eu faço exatamente dessa forma como vc desmonstrou…
    acho que pra quem nao usa xml é esse o jeito mesmo…

cara tenho um problema… nao sei se vc ja passou por algo assim

startando o projeto pelo eclipse ele roda bonitinho no navegador, funciona tudo certo

mas quando exporto o .war e coloco ele no apache ele roda bem
até o momento de mandar algo pro servidor,
a requisição chega la do outro lado certinho, executa o codigo e retorna pro lado client…

nessa volta da um nullPointer, la no GWT (todos os parametros q eu mando devolta estao normais)

segue log do apache:

INFO: SessionListener: contextInitialized()
23/11/2010 14:46:46 org.apache.catalina.core.ApplicationContext log
GRAVE: Exception while dispatching incoming RPC call
java.lang.NullPointerException
at com.google.gwt.rpc.server.WebModePayloadSink.getBytes(WebModePayloadSink.java:853)
at com.google.gwt.rpc.server.WebModePayloadSink$PayloadVisitor.push(WebModePayloadSink.java:760)
at com.google.gwt.rpc.server.WebModePayloadSink$PayloadVisitor.visit(WebModePayloadSink.java:349)
at com.google.gwt.rpc.client.ast.InvokeCustomFieldSerializerCommand.traverse(InvokeCustomFieldSerializerCommand.java:76)
at com.google.gwt.rpc.client.ast.RpcCommandVisitor.doAccept(RpcCommandVisitor.java:320)
at com.google.gwt.rpc.client.ast.RpcCommandVisitor.accept(RpcCommandVisitor.java:42)
at com.google.gwt.rpc.server.WebModePayloadSink$PayloadVisitor.visit(WebModePayloadSink.java:236)
at com.google.gwt.rpc.client.ast.ArrayValueCommand.traverse(ArrayValueCommand.java:53)
at com.google.gwt.rpc.client.ast.RpcCommandVisitor.doAccept(RpcCommandVisitor.java:320)
at com.google.gwt.rpc.client.ast.RpcCommandVisitor.accept(RpcCommandVisitor.java:42)
at com.google.gwt.rpc.server.WebModePayloadSink$PayloadVisitor.visit(WebModePayloadSink.java:284)
at com.google.gwt.rpc.client.ast.InstantiateCommand.traverse(InstantiateCommand.java:54)
at com.google.gwt.rpc.client.ast.RpcCommandVisitor.doAccept(RpcCommandVisitor.java:320)
at com.google.gwt.rpc.client.ast.RpcCommandVisitor.accept(RpcCommandVisitor.java:42)
at com.google.gwt.rpc.server.WebModePayloadSink$PayloadVisitor.visit(WebModePayloadSink.java:368)
at com.google.gwt.rpc.client.ast.InvokeCustomFieldSerializerCommand.traverse(InvokeCustomFieldSerializerCommand.java:76)
at com.google.gwt.rpc.client.ast.RpcCommandVisitor.doAccept(RpcCommandVisitor.java:320)
at com.google.gwt.rpc.client.ast.RpcCommandVisitor.accept(RpcCommandVisitor.java:42)
at com.google.gwt.rpc.server.WebModePayloadSink$PayloadVisitor.visit(WebModePayloadSink.java:399)
at com.google.gwt.rpc.client.ast.ReturnCommand.traverse(ReturnCommand.java:44)
at com.google.gwt.rpc.client.ast.RpcCommandVisitor.doAccept(RpcCommandVisitor.java:320)
at com.google.gwt.rpc.client.ast.RpcCommandVisitor.accept(RpcCommandVisitor.java:42)
at com.google.gwt.rpc.server.WebModePayloadSink.accept(WebModePayloadSink.java:883)
at com.google.gwt.rpc.server.RPC.streamResponse(RPC.java:472)
at com.google.gwt.rpc.server.RPC.invokeAndStreamResponse(RPC.java:198)
at com.google.gwt.rpc.server.RpcServlet.processCall(RpcServlet.java:161)
at com.google.gwt.rpc.server.RpcServlet.processPost(RpcServlet.java:222)
at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Thread.java:662)

andei lendo, vi que as classes precisavam ter o construtor, (mesmo que nao usasse)
nao sei se to usando a Serialização errado

ja tentei como IsSerializable e o Serializable

Ola Jhouw,

As minhas aplicações no GWT funcionam normalmente tanto no Eclipse quanto no servidor com o Tomcat por exemplo…
Os DTOs que eu utilizo para transferir os dados via RPC eu sempre implemento IsSerializable(com.google.gwt.user.client.rpc.IsSerializable) e eles tem que ficar do lado client da aplicação.

Me diz uma coisa, no eclipse você criou seu projeto como GWT Application ou DynamicWeb Project?
Quando você executa pelo eclipse você roda em cima do Tomcat ou executa no servidor embutido do GWT(Jetty se não me engano)?

Então cara, eu realmente nao sei, pq é um projeto da empresa, quando eu cheguei aqui ja estava criado esse projeto
ele roda em cima do apache… mas o comportamento dele é diferente rodando pelo apache mesmo do que quando roda pelo eclipse

mas enfim

eu achei o problema

eu tinha um atributo em uma classe que era Object…

abraço