0

Services in OFBiz

Geschrieben am 06.08.2012 in Technik, Tutorials von Mirko Vogelsmeier

Basierend auf früheren Tutorials möchten wir heute Services in OFBiz näher bringen. OFBiz-Services stellen einen generischen Ansatz bereit, um Methoden diverser Dialekte bzw. Programmiersprachen (z.B. Java, SimpleMethod, SOAP-Webservices, …) transaktionssicher aufzurufen. Da Services ihre Funktionalität komplett kapseln, können sie sehr flexibel eingesetzt werden. So ist es beispielsweise sehr einfach möglich, ein Feature mehrfach zu verwenden – auch aus verschiedenen Kontexten und Programmiersprachen heraus. Ein Großteil der Business-Logik innerhalb von OFBiz ist bereits als Services umgesetzt, so dass man sich als Entwickler für viele Problemstellungen einfach der Lösungen aus dem Framework bedienen kann. Über nur einen Flag werden Services von OFBiz als Webservice bereitgestellt und die WSDL entsprechend publiziert – natürlich wird beim späteren Aufruf die OFBiz-Berechtigungssteuerung berücksichtigt. Als Webservice-Komponente verwendet OFBiz das Apache Axis und Apache Axis2 (Webseite des Projekts). Um einen Service in OFBiz zu erstellen und auszuführen sind 4 Schritte notwendig:

  1. Die Servicedefinition muss erstellt werden.
  2. Die Datei mit der Servicedefinition muss OFBiz bekannt gemacht werden.
  3. Die Methode, welcher der Service ausführt muss erstellt werden.
  4. Der Service muss aufgerufen werden

Die Servicedefinition erstellen

Um einen neuen Webservice anzulegen, muss dieser zunächst in einer XML-Struktur definiert werden. Hierzu erstellen Sie in dem Ordner servicedef Ihres Moduls eines Datei „services.xml“. Nun können Sie Ihren ersten Webservice definieren. Hier ein einfaches Beispiel:

 <service name="addNumbers" engine="java" export="true" location="org.ofbiz.ofbizfrontend.MyFrontendServices" invoke="addNumbers"> <attribute name="number1" mode="IN" type="Integer" /> <attribute name="number2" mode="IN" type="Integer" /> <attribute name="sum" mode="OUT" type="Integer" /> </service>

Der Servicename sollte einzigartig im Projekt sein, andererseits überschreiben sich gleichnamige Services gegenseitig (was sehr, sehr! verwirrend werden kann). Dann wird die engine ausgewählt – in diesem Beispiel verwende ich eine Java-Methode. Optional können Sie aber auch Groovy, Jpython, JavaScript, SimpleMethods, andere Webservices, etc. aufrufen (eine komplette Liste finden Sie in der serviceengine.xml). Ich gebe nun den Pfad zu meiner Klasse per location, dann den Methodennamen per invoke an. Durch export=„true“ mache ich aus meinem OFBiz-Service einen Webservice, welcher per SOAP/HTTP/JMSerreichbar ist. Folgende weitere Optionen können Sie definieren

  • auth (true): Ein Benutzer muss eine korrekte Kombination von Benutzername und Passwort über die Parameter angeben. Anhand dieses Benutzers werden die Berechtigungen geprüft.
  • validate (true): Es wird die Typsicherheit geprüft.

Im Service-Element können Attribute definiert werden, welche in den Service gegeben werden (IN -Parameter) und welche vom Service ausgegeben werden sollen (OUT-Parameter). Ebenso ist es möglich INOUT-Parameter zu definieren. Als Typ werden Integer, String, … aber auch komplette Pfade wie java.util.List zu den Typen akzeptiert.

Die Datei mit der Servicedefinition OFBiz bekannt machen

Hierzu fügen Sie folgende Zeile in die ofbiz-component.xml des Moduls hinzu: Definition der Services in den ofbiz-components.xml

Die Service-Methode erstellen

In meinem Modul erstelle ich wie in der Servicedefinition beschrieben unter /src/org/ofbiz/ofbizbizfrontend eine neue Klasse mit dem Namen MyFrontendServices.java mit folgendem Inhalt:

public static Map addNumbers(DispatchContext dctx, Map context) { Integer result = (Integer) context.get("number1") + (Integer) context.get("number2"); Map resultMap = ServiceUtil.returnSuccess(); resultMap.put("sum", result); return resultMap; }

Die aufzurufende Java-Methode muss public static sein, einen Rückgabetyp Map<String, Object> und die Übergabeparameter DispatchContext dctx, Map<String, ? extends Object> context haben. Dispatcher und Delegator für weitere Service- und Datenbankoperationen können aus dem DispatcherContext gezogen werden. Die Service-Attribute sind in der Context-Map vorhanden. Im Methodenrumpf führe ich meine Rechenoperation aus. Zum Erstellen eines return-Wertes verwende ich die ServiceUtil-Klasse und initialisiere eine „Success-Map“, welche ich dann mit dem Out-Parameter „sum“ als Schlüssel entsprechend der Servicedefinition befülle. Alternativ kann ein Rückgabewert auch als Error oder Failure definiert werden.

Aufrufen eines OFBiz-Services

Das Aufrufen eines OFBiz-Services kann unter anderem wie folgt passieren:

  • Durch ein Event im controller:
     <request-map uri="addNumbers"> <security https="true" auth="false"/> <event type="service" invoke="addNumbers"/> <response name="success" type="none"/> </request-map>
  • Durch eine Service-Gruppe, einer Zusammenfassung von mehreren Services zu einem.
  • Durch einen Aufruf über den Dispatcher (z.B. über Java-Klasse oder SimpleMethod)
  • Über eine seca: Ein Trigger welcher auf Services reagiert
  • Über eine eca: Ein Trigger auf einer DB-Tabelle
  • Über eine mca: Ein Trigger auf eine Email
  • Über das Backend unter /webtools/control/runService
  • Als Webservice (wenn so definiert). Die WSDL-Datei finden Sie unter /webtools/control/SOAPService/addNumbers?wsdl

Details zum Servicerumpf

Im Folgenden finden Sie weitere definierbare Elemente für den Servicerumpf. Vor dem ersten Attribute:

  • auto-attributes: Die Attribute und Attribut-Typen werden direkt aus einer Entität übernommen.
  • implements: Sie können die Vererbung verwenden um ein bestimmtes Service-Interface zu implementieren (vom Typ engine=„interface“). Z.B. Ein Service zum versenden einer Bestellbestätigung per Email verwendet das Interface sendMailInterface, welches z.B. Empfänger, Absender, Betreff, … als Attribute definiert.
  • permission-service oderrequired-permissions: Zum prüfen der Berechtigung des Benutzers.
  • <namespace>: Sollte die engine=„soap“ sein, definieren Sie hier den Namespace. Über diesen Engine-Typ lassen sich externe Webservices aufrufen. Beispiele finden Sie in der services_test.xml (framework/common) unter dem ServicenamentestRemoteSoap1.

Nach dem letzten Attribute:

  • override: Bereits definierte Attribute können überschrieben werden. Dies ist sinnvoll, wenn Sie auto-attributes verwenden.
Dieser Artikel gefällt Ihnen? Sagen Sie's Ihren Freunden:

Hinterlassen Sie eine Antwort





*