2013-01-08 143 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

你应该纪念这个作为回答,这将帮助别人找到自己的方式... –