2013-01-08 2 views
9

Ich entwickle eine Android-App für die Verbindung zum Tridion 2011 SP1 Core Service. Bisher habe ich Android WS Stubs aus dem Kerndienst wsdl mit wsclient erstellt.Verbindung zum Tridion Core Service von einem Android-Client aus nicht möglich

Importiert diese Stubs, die Zugriff auf alle Kern-Service-Methoden ermöglichen.

Ich kann jetzt authentifizieren über die Android-Anwendung auf Tridion aber sobald ich selbst die grundlegendsten von Web-Service-Anrufe, wie getApiVersion() auszuführen versuchen, erhalte ich die Fehlermeldung:

ReflectionHelper*java.lang.NoSuchFieldException: GetApiVersionResult.

Ich habe mich gefragt, Hat es noch jemand geschafft, eine Java Android App zu erstellen, die mit dem Core Service kommuniziert?

Interessanterweise, wenn ich den Code als Java-Anwendung, mit wsimport Stubs funktioniert alles funktioniert ein Vergnügen.

Jede Hilfe wird geschätzt. Denn hier Referenz ist ein Code-Schnipsel:

Um zu Tridion zu verbinden:

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

Um die APIVERSION

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

Hallo Allan, im Allgemeinen ist es am besten, die gesamte Ausnahme an 'Log.e' und nicht nur an' toString' zu übergeben: 'Log.e (" TridionConnect "," Authentifizierungsfehler ", e);' –

+0

I Sehen Sie, dass Sie bereits gesagt haben, dass der Code in einem normalen Programm gut funktioniert. In diesem Fall kann es sich um einen Unterschied zwischen der echten JVM/JRE und Dalvik handeln. Aber ohne Ihr Problem zu reproduzieren, kann ich nicht sicher sein. –

+0

Ich komme nun zu dem Schluss, dass dies wie oben beschrieben nicht möglich ist. Ich habe eine alternative Lösung, die ich jetzt untersuche. –

Antwort

1

Frank zu bekommen,

Es ist nicht möglich für ein paar Gründe .

Wenn Sie mit wsimport den coreservice-Proxy erstellen, wird die javax-Bibliothek verwendet, die in der JRE vorhanden ist. Dalvik implementiert jedoch nur eine Teilmenge der javax-Bibliothek, was bedeutet, dass dieser Ansatz in der Android-Umgebung unmöglich ist.

Ich schaute dann auf Ksoap2 Tools zum Erstellen des Proxy. Dies schien OK zu funktionieren, da es zwar einen Proxy erstellt hat, jedoch nicht mit dem Core Service übereinstimmt, so dass ich mich nicht authentifizieren konnte. Ich bin mit diesem Ansatz nicht weiter gekommen, als den JRE-Proxy über den KSoap2-Proxy zu untersuchen. Sie waren ganz anders.

An diesem Punkt trat ich einen Schritt zurück, trank eine Tasse Tee und überarbeitete den Ansatz.

Ich habe einen C# REST-Dienst erstellt, um zwischen der Android-App und dem Kerndienst zu sitzen.

Dieser Ansatz erschien ein wenig komplex, bietet aber viele Vorteile. Viele der Spatenarbeiten können im REST-Service durchgeführt werden, der viel schneller ist als ähnlicher Code auf einem Tablet oder Telefon.

Zweitens befindet sich der REST-Dienst auf demselben Server wie der CMS/CoreService, so dass die Kommunikation schneller ist und Sie die REST-Anforderungen der Android-App viel leichter machen können.

Ich habe die Anwendung an dem Punkt, wo Sie Tridion authentifizieren können, wählen Sie eine Publikation und Komponenten, die dann in einem dynamischen Layout gerendert wird bereit für Update/Save/Publish.

Der große Nachteil dieses Ansatzes besteht darin, dass der REST-Dienst "zustandslos" sein sollte, sodass oberflächlich bei jeder Anforderung eine Authentifizierung beim Core-Service erforderlich ist. Natürlich tue ich das nicht, aber du musst dir eine alternative Herangehensweise ausdenken Oauth, geteiltes Geheimnis etc.

In ersten Tests schien dieser Ansatz auf einem Android-Gerät ziemlich glatt zu sein.

+1

Hallo Bart, ich habe mich dem Bereich 51 verpflichtet. Ich habe mit der Entwicklung von Tridion begonnen, als wir in Version 5.1 waren, und die einzige Ressource waren die tridion-Foren und die Support-Abteilung. Es ist höchste Zeit, dass wir eine öffentlich verfügbare Ressource für alles Tridion haben. –

+0

Beide obigen Kommentare von Josanne Kane, sind in der Tat von mir .... Meine Frau hat ganz offensichtlich meinen Laptop benutzt. Abgesehen davon, nehmen Sie nichts von ihrem Rat, es sei denn, es betrifft Backen! –

+0

Sie sollten dies als die Antwort markieren, es wird anderen helfen, ihren Weg zu finden ... –

Verwandte Themen