2013-01-08 178 views
9

我正在開發一個Android應用程序連接到的tridion 2011 SP1核心服務連接到外表套上核心服務。 到目前爲止,我已經使用wsclient從核心服務wsdl創建了Android WS Stub。無法從Android客戶端

進口的存根,允許訪問所有的核心服務的方法。

我現在可以驗證通過Android應用程序的tridion但只要我嘗試執行甚至連最基本的Web服務調用,如getApiVersion(),我得到的錯誤:

ReflectionHelper*java.lang.NoSuchFieldException: GetApiVersionResult.

我想知道是否有其他人設法創建了一個與Core Service進行通信的java android應用程序?

有趣的是,如果我運行代碼的Java應用程序,使用wsimport的存根一切正常治療。

任何幫助表示讚賞。僅供參考這裏的代碼片段:

要連接到套上:

class TridionConnect extends AsyncTask<String, Integer, String> { 
    // Called to initiate the background activity 

    @Override 
    protected String doInBackground(String... statuses) { 
    try { 
     Authenticator.setDefault(new Authenticator() { 
     @Override 
     protected PasswordAuthentication getPasswordAuthentication() { 
      return new PasswordAuthentication("username", "password".toCharArray()); 
     } 
     }); 

     url = new URL("http://tridion-server/webservices/CoreService2011.svc?wsdl"); 

     System.out.println(String.format("Get Service")); 
     service = new CoreService2011(); 
     System.out.println(String.format("Get Client")); 

     client = service.getBasicHttp(); 

     return "Authenticated To Tridion"; 
    } catch (Exception e) { 
     Log.e("Authentication failure", e.toString()); 
     e.printStackTrace(); 
     return "Failed to authenticate"; 
    } 
    } 

    // Called when there's a status to be updated 
    @Override 
    protected void onProgressUpdate(Integer... values) { 
    super.onProgressUpdate(values); 
    // Not used in this case 
    } 

    // Called once the background activity has completed 
    @Override 
    protected void onPostExecute(String result) { // 
    Toast.makeText(FullscreenActivity.this, result, Toast.LENGTH_LONG).show(); 
    area.setText("Authenticated to Tridion OK"); 
    } 
} 

要獲得ApiVersion

client.getApiVersion(); 
UserData currentUser = client.getCurrentUser(); 
System.out.println(String.format("'%s' %s", currentUser.getTitle(), currentUser.getId())); 
+1

嗨艾倫,一般最好是整個例外傳遞給'Log.e'並不僅僅是'toString':'Log.e(「TridionConnect」,「身份驗證失敗」,E);' –

+0

我只是看到你已經說過這些代碼在正常程序中工作正常。在這種情況下,它可能是真正的JVM/JRE和Dalvik之間的區別。但是如果沒有再現你的問題,我不能確定。 –

+0

我現在得出結論,這是不可能的,如上所述。我現在正在研究一個替代解決方案。 –

回答

1

弗蘭克,

這是不可能的一對夫婦的原因。

如果您使用的wsimport創建coreservice代理將使用javax庫,它存在於JRE。然而,Dalvik只實現了javax庫的一個子集,這意味着這種方法在Android環境中是不可能的。

我又看了看Ksoap2工具,用於創建代理。這似乎工作正常,儘管它創建了一個代理,但它不符合核心服務,所以我無法進行身份驗證。除了檢查JRE代理和Ksoap2代理之外,我沒有進一步討論這種方法。他們完全不同。

在這一點上,我向後退了一步,有茶和重新設計該辦法的一個杯子。

我創建了一個C#REST服務的Android應用和核心服務之間坐。

這種做法顯得有點複雜,但它提供了很多優勢。許多鏟子工作可以在REST服務中完成,這將比平板電腦或手機上的類似代碼快得多。

其次REST服務坐在同一服務器CMS/CoreService就這麼通訊科是更快,你可以從Android應用程序的REST請求輕得多。

我已經得到了應用程序,你可以驗證到外表套上,選擇發佈,並隨後在動態佈局呈現準備更新組件/保存/發佈點。

這種方法的一個大缺點是REST服務「應該」是無狀態的,從而表面上,你必須驗證到coreservice爲每個請求。當然,我不這樣做,但你必須提出一些替代方法Oauth,分享祕密等。

在最初的測試這種做法似乎是在Android設備上相當光滑。

+1

嗨巴特,我致力於51區的建議。當我們在5.1版本時,我開始了Tridion開發,唯一的資源是tridion論壇和支持部門。現在正是我們爲Tridion所有事情提供公開可用資源的時候了。 –

+0

以上來自Josanne凱恩雙方的意見,都是從我其實....我的妻子很明顯用我的筆記本電腦。除此之外,除非涉及烘焙,否則不要接受她的任何建議! –

+0

你應該紀念這個作爲回答,這將幫助別人找到自己的方式... –