2010-01-22 63 views
11

我有一個普通的Java應用程序,並希望訪問一個GWT RPC端點。任何想法如何做到這一點?我的GWT應用程序在GAE/J上,我可以使用REST,但我已經擁有GWT RPC端點,並且不想構建另一個外觀。如何從非GWT(但是Java)應用程序調用服務器上的GWT RPC方法?

是的,我看過Invoke a GWT RPC service from Java directly,但這個討論進入了一個不同的方向。

+2

爲什麼這個社區wiki?它是否由於編輯過多而自動切換? – 2010-07-15 14:00:02

回答

4

包中的RPC協議的GWT中的Java實現com.google.gwt.user.server.rpccom.google.gwt.user.server.rpc.impl不幸的是,只包括請求的反序列化和響應的序列化。真正的工作是在類ServerSerializationStreamReaderServerSerializationStreamWriter(每個約750行代碼)中完成的。爲了實現一個客戶端,顯然需要對請求進行序列化並反序列化響應,但由於協議和AFAIK沒有可用的文檔,因此沒有可用的Java客戶端實現,您可能必須對(de)序列化類並編寫你自己的代碼來完成「相反」的任何事情。

您可以找到有關協議here

1

不幸的是一些高層次的信息,我認爲jarnbjo是對有關重新實現瀏覽器的一半的RPC機制。或者,如果您最終不得不爲遠程客戶端編寫REST接口,則可以將您的GWT應用程序從RPC切換出來,並在其中使用REST接口,並在外部客戶端和GWT之間共享您的客戶端庫客戶端界面。

1

我已經探索了所有的答案,今天我成功了作爲一個純Java的客戶端工作。

SyncProxy需要您擁有GWT項目(服務器端)的完整代碼。爲此,您只需創建一個將SyncProxy激活的額外類。在這個類中你應該導入所有需要的類和函數,這就是爲什麼你需要服務器代碼。

,你應該檢查下列文件可以從服務器上下載:

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

我cookiemanager前添加代碼,因爲我的服務器端uri爲HTTPS。 而我的課程包含一個登錄操作,然後觸發GWT請求。 這是我的代碼(我已經升級SyncProxy一點,因爲它不支持cookie /會話身份驗證檢查。):

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(); 
       } 

       } 
} 

一些外聯,你可能想:

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