2013-01-08 1 views
9

Tridion 2011 SP1 핵심 서비스에 연결하기위한 Android 앱을 개발 중입니다. 지금까지 wsclient를 사용하여 핵심 서비스 wsdl에서 Android WS Stubs를 만들었습니다.Android 클라이언트에서 Tridion Core Service에 연결할 수 없습니다.

모든 핵심 서비스 메소드에 대한 액세스를 허용하는 스텁을 가져 왔습니다.

지금은 안드로이드 응용 프로그램을 통해 Tridion을 인증 할 수 있지만 최대한 빨리 getApiVersion() 등, 웹 서비스 호출 심지어 가장 기본적인 수행하려고, 나는 오류 얻을 :

ReflectionHelper*java.lang.NoSuchFieldException: GetApiVersionResult.

궁금 해서요을 코어 서비스와 통신하는 자바 안드로이드 앱을 만드는 사람은 누구입니까?

흥미롭게도, 자바 애플리케이션으로 코드를 실행하면 wsimport 스텁을 사용하여 모든 것이 처리됩니다.

도움을 주시면 감사하겠습니다.

이 Tridion에 연결하려면 :

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

안녕하세요. Allan은 일반적으로'toString'뿐만 아니라'Log.e'에 전체 예외를 전달하는 것이 가장 좋습니다 : Log.e ("TridionConnect", "Authentication Failure", e), ' –

+0

I 그냥 코드가 정상적인 프로그램에서 잘 작동한다고 이미 말한 것을보십시오. 이 경우 실제 JVM/JRE와 Dalvik의 차이 일 수 있습니다. 그러나 당신의 문제를 재현하지 않고, 나는 확신 할 수 없다. –

+0

나는 이것이 위에서 설명한 것처럼 가능하지 않다는 결론에 이르고있다. 나는 현재 조사하고있는 대체 솔루션을 가지고있다. –

답변

1

프랭크을 얻으려면,

그것은 몇 가지 이유 수 없습니다 여기에 참고로 코드 조각입니다 .

wsimport를 사용하여 coreservice 프록시를 만드는 경우 JRE에있는 javax 라이브러리를 사용합니다. 그러나 Dalvik은 javax 라이브러리의 하위 세트 만 구현합니다. 즉, Android 환경에서는이 접근법을 사용할 수 없습니다.

그런 다음 프록시 생성을위한 Ksoap2 도구를 살펴 보았습니다. 이것은 프록시를 만들었을 때처럼 잘 작동하는 것 같았지만 coreservice와 일치하지 않아서 인증 할 수 없었습니다. JRE 프록시 v Ksoap2 프록시를 검토하는 것 이상의이 접근법으로는 더 이상 얻지 못했습니다. 그들은 아주 달랐다.

이 시점에서 나는 한 걸음 물러서고 한 잔의 차를 마시고 그 접근법을 다시 설계했다.

Android 앱과 핵심 서비스 사이에 앉아서 C# REST 서비스를 만들었습니다.

이 접근 방식은 다소 복잡해 보였지만 많은 이점을 제공합니다. 스페이드 작업은 REST 서비스에서 수행 할 수 있으며 태블릿이나 휴대 전화의 유사한 코드보다 훨씬 빠릅니다.

두 번째로 REST 서비스는 CMS/CoreService와 동일한 서버에 있으므로 통신이 빠르며 Android 앱의 REST 요청을 훨씬 가볍게 만들 수 있습니다.

Tridion에 인증하고, 발행물을 선택하고, 업데이트/저장/게시 준비가 된 동적 레이아웃으로 렌더링되는 구성 요소를 사용할 수있는 시점까지 응용 프로그램을 가지고 있습니다.

이 접근법의 한 가지 단점은 REST 서비스가 '상태 유지'되어야한다는 것이므로 모든 요청에 ​​대해 coreservice에 인증해야한다는 것입니다. 물론 그렇게하지는 않지만 Oauth, 공유 된 비밀 등의 대체 접근 방식을 찾아야합니다.

초기 테스트에서이 접근법은 안드로이드 장치에서 상당히 매끄러운 것처럼 보였습니다.

+1

안녕하세요. Bart, 저는 지역 51 제안서를 작성했습니다. 우리가 버전 5.1에 있었을 때 나는 Tridion 개발을 시작했고 유일한 자원은 tridion 포럼과 지원 부서였습니다. 우리가 Tridion 모든 것에 공개적으로 사용할 수있는 자원을 확보해야 할 때입니다. –

+0

Josanne Kane의 위의 두 의견은 사실 내게 있습니다 .... 내 아내는 분명히 내 랩톱을 분명히 사용했습니다. 옆으로, 굽기에 염려하지 않는 한 그녀의 충고를하지 말라! –

+0

이것을 답으로 표시해야하며 다른 사람들이 길을 찾는 데 도움이 될 것입니다 ... –