Problema com comunicacao RPC

42 views
Skip to first unread message

Robinho de Morais

unread,
Dec 30, 2012, 3:13:43 PM12/30/12
to gwt-b...@googlegroups.com
Estou precisando de uma ajuda na comunicação RPC, já tentei várias vezes....pelo o Eclipse e não estou conseguindo, estou seguindo as aulas do neri, onde ele ensina a comunicação rpc com um sistema de login bem simples porém no netbeans, eu segui várias  vezes as aulas, mas sempre caiu no mesmo erro, já peguei um video no you tube em espanhol onde o cara ensina no proprio eclipse o rpc, mas cheguei no mesmo erro que dá pelo exemplo do neri.

Estou usando o eclipse Juno e só gwt.
> criei um projeto chamado SistemaLoginRPC;

conteudo do meu arquivo SistemaLoginRPC.gwt.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--
  When updating your version of GWT, you should also update this DTD reference,
  so that your app can take advantage of the latest GWT module capabilities.
-->
<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.5.0//EN"
<module rename-to='sistemaloginrpc'>
  <!-- Inherit the core Web Toolkit stuff.                        -->
  <inherits name='com.google.gwt.user.User'/>

  <!-- Inherit the default GWT style sheet.  You can change       -->
  <!-- the theme of your GWT application by uncommenting          -->
  <!-- any one of the following lines.                            -->
  <inherits name='com.google.gwt.user.theme.clean.Clean'/>
  <!-- <inherits name='com.google.gwt.user.theme.standard.Standard'/> -->
  <!-- <inherits name='com.google.gwt.user.theme.chrome.Chrome'/> -->
  <!-- <inherits name='com.google.gwt.user.theme.dark.Dark'/>     -->

  <!-- Other module inherits                                      -->

  <!-- Specify the app entry point class.                         -->
  <entry-point class='br.com.videoaulasneri.client.SistemaLoginRPC'/>

  <!-- Specify the paths for translatable code                    -->
  <source path='client'/>
  <source path='shared'/>

</module>


conteudo do loginInterface.java

package br.com.videoaulasneri.client;

import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;

@RemoteServiceRelativePath("sistemaloginrpc")
public interface loginInterface extends RemoteService{
public String validaUsuarioSenha(String usuario, String senha);
}


conteudo do loginInterfaceAsync.java

package br.com.videoaulasneri.client;

import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;

@RemoteServiceRelativePath("sistemaloginrpc")
public interface loginInterface extends RemoteService{
public String validaUsuarioSenha(String usuario, String senha);
}


conteudo da tela SistemaLoginRPC.java

package br.com.videoaulasneri.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PasswordTextBox;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;


public class SistemaLoginRPC implements EntryPoint {

public static loginInterfaceAsync getServico(){
return GWT.create(loginInterface.class); 
}
public void onModuleLoad() {
final AsyncCallback<String> callback = new AsyncCallback<String>() {

@Override
public void onFailure(Throwable caught) {
Window.alert("Problema na comunicacao");
}

@Override
public void onSuccess(String result) {
Window.alert(result);
}
};
Label lbUsu = new Label("Usuario:");
Label lbSen = new Label("Senha:");
final TextBox tbUsu = new TextBox();
final PasswordTextBox psSen = new PasswordTextBox();
Button btEnviar = new Button("Enviar");
btEnviar.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
getServico().validaUsuarioSenha(tbUsu.getText(), psSen.getText(), callback);
}
});
RootPanel.get().add(lbUsu);
RootPanel.get().add(tbUsu);
RootPanel.get().add(lbSen);
RootPanel.get().add(psSen);
RootPanel.get().add(btEnviar);
}
}


os loginInterface, loginInterfaceAsync e SistemaLoginRPC encontrasse na pasta br.com.videaulasneri.client

o conteúdo loginInterfaceImpl.java

package br.com.videoaulasneri.server;

import br.com.videoaulasneri.client.loginInterface;

import com.google.gwt.user.client.Window;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;

public class loginInterfaceImpl extends RemoteServiceServlet implements loginInterface{

@Override
public String validaUsuarioSenha(String usuario, String senha) {
return "Do servidor retornou "+usuario;
}
}

e meu arquivo web.xml


<?xml version="1.0" encoding="UTF-8" standalone="no"?><web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee                http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

  <!-- Servlets -->
  <servlet>
    <servlet-name>SistemaLoginRPC</servlet-name>
    <servlet-class>br.com.server.loginInterfaceImpl</servlet-class>
  </servlet>
  
  <servlet-mapping>
  <servlet-name>SistemaLoginRPC</servlet-name>
  <url-pattern>/br.com.videoaulasneri/sistemaloginrpc</url-pattern>
  </servlet-mapping>
  
  <!-- Default page to serve -->
  <welcome-file-list>
    <welcome-file>SistemaLoginRPC.html</welcome-file>
  </welcome-file-list>

  <servlet>
    <servlet-name>SystemServiceServlet</servlet-name>
    <servlet-class>com.google.api.server.spi.SystemServiceServlet</servlet-class>
    <init-param>
      <param-name>services</param-name>
      <param-value/>
    </init-param>
  </servlet>

  <servlet-mapping>
    <servlet-name>SystemServiceServlet</servlet-name>
    <url-pattern>/_ah/spi/*</url-pattern>
  </servlet-mapping>

</web-app>


quando compilo e executo o enviar ele dá esses erros:

Initializing App Engine server
Dez 30, 2012 7:40:42 PM com.google.apphosting.utils.jetty.JettyLogger info
INFO: Logging to JettyLogger(null) via com.google.apphosting.utils.jetty.JettyLogger
Dez 30, 2012 7:40:42 PM com.google.apphosting.utils.config.AppEngineWebXmlReader readAppEngineWebXml
INFO: Successfully processed R:\Innovation\Projeto Innovation\SistemaLoginRPC\war\WEB-INF/appengine-web.xml
Dez 30, 2012 7:40:42 PM com.google.apphosting.utils.config.AbstractConfigXmlReader readConfigXml
INFO: Successfully processed R:\Innovation\Projeto Innovation\SistemaLoginRPC\war\WEB-INF/web.xml
Dez 30, 2012 5:40:42 PM com.google.appengine.tools.development.DevAppServerImpl start
INFO: The server is running at http://localhost:8888/
Dez 30, 2012 5:40:42 PM com.google.appengine.tools.development.DevAppServerImpl start
INFO: The admin console is running at http://localhost:8888/_ah/admin
Dez 30, 2012 6:00:43 PM com.google.appengine.tools.development.LocalResourceFileServlet doGet
WARNING: No file found for: /sistemaloginrpc/sistemaloginrpc


alguém pode me ajudar, já mudei várias vezes o @RemoteServiceRelativePath("sistemaloginrpc") do loginInterface, mas nada....

Obrigado...

Vagner Araujo

unread,
Dec 30, 2012, 4:41:58 PM12/30/12
to gwt-b...@googlegroups.com
Então,

o problema está com o seu mapeamento no web.xml, você deve fazer o seguinte...

troque isso:


  <servlet-mapping>
  <servlet-name>SistemaLoginRPC</servlet-name>
  <url-pattern>/br.com.videoaulasneri/sistemaloginrpc</url-pattern>
  </servlet-mapping>

Por isso:


  <servlet-mapping>
  <servlet-name>SistemaLoginRPC</servlet-name>
  <url-pattern> /sistemaloginrpc/sistemaloginrpc</url-pattern>
  </servlet-mapping>

O "problema" é que você está usando a anotação @RemoteServiceRelativePath, introduzida no GWT 1.5(se não me falhe a memoria), essa anotação faz com que você use o serviço relativo ao path da aplicação, como você está usando o atributo rename-to da tag module, a aplicação será compilada para o diretório sistemaloginrpc como especificado na tag module, então os seus servlets terão que ter esse caminho... sistemaloginrpc/CaminhoDoSeuSevlet, note que sistemaloginrpc é o atributo definido na tag module, enquanto que CaminhoDoSeuServlet é o que você passa para anotação @RemoteServiceRelativePath.

Antes da introdução dessa anotação, era usado a interface ServiceDefTarget para definir o path do servlet. Na verdade, o que @RemoteServiceRelativePath faz é simplesmente usar essa interface para especificar o caminho do servlet.


--
Vagner Araujo



Robinho de Morais

unread,
Dec 31, 2012, 10:10:30 AM12/31/12
to gwt-b...@googlegroups.com
Opa deu certo Vagner obrigado....

Tenho outra maneira de fazer essa comunicação ?

Vagner Araujo

unread,
Dec 31, 2012, 10:36:12 AM12/31/12
to gwt-b...@googlegroups.com
Em 31 de dezembro de 2012 13:10, Robinho de Morais <robinho...@gmail.com> escreveu:
Opa deu certo Vagner obrigado....

Tenho outra maneira de fazer essa comunicação ?

Sem usar a anotação @RemoteServiceRelativePath?

É isso o que você quer saber ?

Se for isso, tem sim, usando a interface ServiceDefTarget, prefiro usar ela em vez da anotação @RemoteServiceRelativePath.

Para usar essa interface ou como alguns chamam, usar a sintaxe antiga.... faça o seguinte.

...

SeuServicoAsync async = GWT.create(SeuServico.class);
ServiceDefTarget sdt = (ServiceDefTarget) async;
sdt.setServiceEntryPoint("caminhoDoSeuServlet");

...

caminhoDoSeuServlet é o mapeamento que você faz em seu web.xml, mais especificamente em sua tag <url-pattern />.


--
Vagner Araujo


Robinho de Morais

unread,
Dec 31, 2012, 10:50:37 AM12/31/12
to gwt-b...@googlegroups.com
Isso mesmo, mas isso eu faço onde ?
não preciso criar a classe Async e Impl ? faço direto no SistemaLoginRPC.java ?

Vagner Araujo

unread,
Dec 31, 2012, 11:43:11 AM12/31/12
to gwt-b...@googlegroups.com
Então,

a forma de criação das instâncias do serviço depende de como você quer estruturar as coisas... por exemplo, se você quiser criar uma classe auxiliar de serviço que retorne os serviços que serão utilizados para invocar os seus métodos que se comunicam com o servidor... você pode proceder como o exemplo abaixo.

Exemplo:

public final class ServiceUtil {

private static MyServiceOneAsync myServiceOneAsync;

private  ServiceUtil(){
}//end constructor


public static final MyServiceOneAsync getMyServiceOneAsync() {
  if (myServiceOneAsync == null) {
      myServiceOneAsync = GWT.create(MyServiceOne.class);
      ServiceDefTarget sdt = (ServiceDefTarget) sdt;
      sdt.setServiceEntryPoint("caminhoDoSeuServlet");
  }// end if

  return myServiceOne;

}// end getMyServiceOneAsync

}//end ServiceUtil


Pronto, agora você invoca ServiceUtil.getMyServiceOneAsync() quando você precisar chamar algum método de serviço de comunicação com o servidor. Veja como exemplo o seu código postado em seu primeiro e-mail, você poderia ter um método de login em suas interfaces de serviços, MyServiceOne e MyServiceOneAsync, e no evento do botão de login você poderia invocar o método de serviço que faz uma chamada para o servidor...

Exemplo:

....


ServiceUtil.getMyServiceOneAsync().login(argumentos...);

...


--
Vagner Araujo


Robinho de Morais

unread,
Dec 31, 2012, 3:33:43 PM12/31/12
to gwt-b...@googlegroups.com
Humn...saquei vou testar aqui.....obrigado novamente....

Lhe desejo um feliz ano novo, peço desculpas pelas insistências..rsrsr....e muito obrigado pela paciência.
Reply all
Reply to author
Forward
0 new messages