Zugriff auf Microsoft Dynamics CRM 2011 mit Java – Teil I

Microsoft Dynamics CRM

Das CRM bietet für den Zugriff von außen eine SOAP (Simple Object Access Protocol) und OData (Open Data) Schnittstelle an. OData ist ein auf REST (Representational State Transfer) basierende Zugriffsprotokoll von Microsoft. Im deutschsprachigen CRM findet man auch die Bezeichnung „Organisationsdatendienst“. Die URI für diesen Dienst hat dabei folgende Form:

[Your Organization Root URL]/xrmservices/2011/organizationdata.svc

Im Folgenden beschreibe ich die Kommunikation über das OData Protokoll unter Verwendung des Restlet Frameworks.

Das RESTlet Framework

Das Restlet Framework ist ein Open Source Produkt zur Erstellung und Verwendung eigener APIs gemäß der REST Architektur.

Die org.restlet.ext.odata Erweiterung des Restlet Frameworks stellt eine API zur Verfügung, mit der Zugriffe über das OData Protokoll auf entfernte Services möglich sind. So kann z.B. auf Entitäten, deren Attribute und deren Beziehungen zu anderen Entitäten im CRM von Microsoft zugegriffen werden.

Um diese Entitäten auslesen oder verändern zu können, wird für jede Entität eine eigene Klasse benötigt, in der die entsprechenden Attribute definiert sind. Zudem muss die Bezeichnung der Klasse mit dem eindeutigen Name der Entität im CRM übereinstimmen. Zu diesem Zweck bietet die Restlet Erweiterung ein Generierungstool an, welches die benötigten Klassen korrekt generiert. Dabei wird auch eine Service-Klasse erzeugt, über deren Methoden schließlich die eigentlichen Rest-Abfragen erstellt werden.

In diesem Artikel werde ich zunächst das Vorgehen zur Generierung der Klassen beschreiben. Die Verwendung der Service-Klasse wird im nächsten Artikel erläutert.

Generierung von Entitäts- und Service-Klassen

Benötigte Komponenten

Für die Generierung der benötigten Klassen werden die folgenden Komponenten genutzt:

  • Java CIFS Client Library für die Authentifizierung
  • Restlet Framework für die Generierung

Ablauf

  1. Ihr erstellt ein neues Java Projekt.
  2. Dem Projekt fügt ihr die folgenden Bibliotheken hinzu (zu finden unter http://restlet.com/  und http://jcifs.samba.org/):


    restlet.ext.atom.jar
    restlet.ext.json.jar
    restlet.ext.net.jar
    restlet.ext.odata.jar
    restlet.ext.xml.jar
    restlet.jar
    restlet.ext.freemarker.jar
    freemarker.jar
    jcifs-1.3.15.jar

  3. Als nächstes erstellt ihr eine Klasse mit der „main“ Methode und folgendem Inhalt:

    Für user, pw, domain und host tragt ihr eure entsprechenden Daten ein. Diese werden für das Setzen des default Authenticator benötigt.

    In Zeile 29 muss die URL zum Organisationsdatendienst des CRMs angegeben werden. Für crmServer setzt ihr die Domain eures CRM-Servers ein. Die gesamte URL könnt ihr auch in eurem CRM nachschlagen unter Einstellungen → Anpassungen → Entwicklerressourcen → Dienstendpunkte: Organisationsdatendienst.

    Als zweites Argument in Zeile 29 tragt ihr den Dateipfad ein, unter dem die generierten Klassen gespeichert werden sollen.

  4. Jetzt führt ihr die Anwendung aus.
  5. Der generierte Code befindet sich in dem von euch angegebenen Verzeichnis. Diesen müsst ihr jetzt nur noch in euer Programm einfügen, mit dem ihr den CRM-Zugriff durchführen wollt.

Hinweis: Sollten Attribute der Entitäten im CRM entfernt werden oder neue hinzugefügt werden, dann kann es passieren, dass es zu Fehlern beim Zugriff aufs CRM mit Restlet kommt, weil die Attribute nicht mehr vorhanden oder noch nicht in den generierten Klassen enthalten sind. In diesem Fall müssen die Klassen mit dem hier beschriebenen Vorgehen neu generiert werden.

Besonderheiten

An dieser Stelle möchte ich noch einige Besonderheiten aufzeigen, die bei uns während der Durchführung aufgetreten sind.

Authentifizierung

Wenn wir an unserem Windows-Rechner angemeldet sind, dann können wir unser CRM direkt aufrufen ohne uns erneut einloggen zu müssen. Genauso erfolgte die Authentifizierung für die Generierung über unser Windows Login. Wir haben den default Authenticator zwar angegeben wie beschrieben, dieser hat jedoch bei der Ausführung nicht gegriffen.

Kollision von Klassennamen

Die Klassen für die Entitäten werden nach dem eindeutigen Name der Entitäten im CRM benannt. Bei uns existiert eine Klasse mit dem eindeutigen Name „List“ worauf hin eine Klasse List generiert wurde. Innerhalb der generierten Klassen wird jedoch auch die Klasse java.util.List verwendet. Somit kam es bei uns zu einer Namenskollision zwischen den beiden Klassen und es wurde eine manuelle Auflösung notwendig. Das ist leider sehr nachteilig, da diese manuelle Korrektur bei jeder Neugenerierung der Klassen durchgeführt werden muss.

 

Quellen

Dieser Artikel wurde unter Zuhilfenahme folgender Quellen erstellt:

Eine Antwort zu “Zugriff auf Microsoft Dynamics CRM 2011 mit Java – Teil I”

  1. […] diesem Artikel erkläre ich, wie die im Artikel Zugriff auf Microsoft Dynamics CRM 2011 mit Java – Teil I generierten Klassen für den Zugriff auf das Microsoft Dynamics CRM über die REST-Schnittstelle […]

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.