2010-01-22 17 views
11

Tengo una aplicación Java normal y quiero acceder a un punto final GWT RPC. ¿Alguna idea de cómo hacer que esto suceda? Mi aplicación GWT está en GAE/J y podría usar REST por ejemplo, pero ya tengo los puntos finales GWT RPC y no quiero construir otra fachada.¿Cómo puedo llamar a un método GWT RPC en un servidor desde una aplicación no GWT (pero Java)?

Sí, he visto Invoke a GWT RPC service from Java directly, pero esta discusión va en una dirección diferente.

+2

¿Por qué esta wiki de la comunidad? ¿Acabo de cambiar automáticamente de demasiadas ediciones? –

Respuesta

4

Desafortunadamente, la implementación de Java en GWT del protocolo RPC en los paquetes com.google.gwt.user.server.rpc y com.google.gwt.user.server.rpc.impl solo cubre la deserialización de solicitudes y la serialización de respuestas. El trabajo real se realiza en las clases ServerSerializationStreamReader y ServerSerializationStreamWriter (cada una de aproximadamente 750 líneas de código).

Para implementar un cliente, obviamente necesita serializar la solicitud y deserializar la respuesta, pero como no hay documentación disponible para el protocolo y las implementaciones de AFAIK no hay clientes de Java disponibles, es probable que tenga que aplicar ingeniería inversa al (de) Clases de serialización y escriba su propio código para hacer todo "al revés".

puede encontrar algo de información de alto nivel sobre el protocolo here

1

Por desgracia, creo que tiene razón sobre jarnbjo tener que reimplementar medio del navegador del mecanismo RPC.

Alternativamente, si termina teniendo que escribir una interfaz REST para clientes remotos, puede desconectar su aplicación GWT de las RPC y utilizar la interfaz REST allí también, y compartir su biblioteca cliente entre los clientes externos y GWT interfaz del lado del cliente.

1

he explorado toda la respuesta y hoy tengo éxito a trabajar como un cliente en java puro.

el SyncProxy necesita que tenga el código completo del proyecto GWT (lado del servidor). Y para hacerlo, simplemente crea una clase adicional que activa SyncProxy en ella. En esta clase, debe importar todas las clases y funciones necesarias, por eso necesita el código del servidor.

y usted debe comprobar siguiente archivo se puede descargar desde el servidor:

compilation-mappings.txt 
*.nocache.js 
*.cache.html 
*.gwt.rpc 

agrego el código antes de cookiemanager, porque mi uri lado del servidor es HTTPS. Y mi clase incluye una acción de inicio de sesión y luego inicia la solicitud de GWT. Este es mi código (He actualizado SyncProxy un poco, ya que no es compatible con la galleta/del cheque de autenticación de sesión.):

package com.xxx.xxx.x.xx; 

import java.io.IOException; 
import java.net.CookieManager; 
import java.net.URISyntaxException; 
import java.security.KeyManagementException; 
import java.security.NoSuchAlgorithmException; 
import java.security.cert.X509Certificate; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

import javax.net.ssl.HostnameVerifier; 
import javax.net.ssl.HttpsURLConnection; 
import javax.net.ssl.SSLContext; 
import javax.net.ssl.SSLSession; 
import javax.net.ssl.TrustManager; 
import javax.net.ssl.X509TrustManager; 

import net.customware.gwt.dispatch.client.standard.StandardDispatchService; 
import net.customware.gwt.dispatch.shared.DispatchException; 

import com.gdevelop.gwt.syncrpc.LoginUtils; 
import com.gdevelop.gwt.syncrpc.ProxySettings; 
import com.gdevelop.gwt.syncrpc.SyncProxy; 

public class TestRemoteExecuteAction { 

      static Logger logger = Logger.getLogger(TestRemoteExecuteAction.class.getName()); 
       public static void main(String[] arg) { 

        SyncProxy.setLoggingLevel(Level.ALL); 

       try { 

         // Create a trust manager that does not validate certificate chains 
        TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() { 
          public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
           return null; 
          } 
          public void checkClientTrusted(X509Certificate[] certs, String authType) { 
          } 
          public void checkServerTrusted(X509Certificate[] certs, String authType) { 
          } 
         } 
        }; 

        // Install the all-trusting trust manager 
        SSLContext sc = SSLContext.getInstance("SSL"); 
        sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 

        // Create all-trusting host name verifier 
        HostnameVerifier allHostsValid = new HostnameVerifier() { 
         public boolean verify(String hostname, SSLSession session) { 
          return true; 
         } 
        }; 

        // Install the all-trusting host verifier 
        HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid); 

        CookieManager cookiemanager = LoginUtils.loginFormBasedJ2EE("https:XXXXX", "XXXX", "XXXX"); 

        SyncProxy.setBaseURL("https://XXXXXX"); 

        StandardDispatchService rpcService = SyncProxy.createProxy(StandardDispatchService.class, 
          new ProxySettings().setCookieManager(cookiemanager)); 

        System.out.println(cookiemanager.getCookieStore().getCookies().get(0)); 
        String JSESSIONID = cookiemanager.getCookieStore().getCookies().get(0).getValue(); 

        rpcService.execute(new XXXXXAction("XXX")); 



       } catch (NoSuchAlgorithmException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (KeyManagementException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (URISyntaxException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (DispatchException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

       } 
} 

Algunos enlace exterior se puede desear:

https://code.google.com/p/gwt-syncproxy/wiki/QuickStart http://cancerberonia.blogspot.de/2012/10/testing-gwt-service-classes.html

Cuestiones relacionadas