2014-06-30 4 views
7

Ich verwende Apache Olingo als OData-Client für ein Java-SDK, die ich für eine RESTful OData API bereitstellen werde. Im SDK möchte ich stark typisierte Klassen haben können, um die OData-Entitäten darzustellen. Ich habe Probleme damit, dies einfach umzusetzen und fühle mich, als würde ich hier eine andere Strategie verpassen.Olingo - Erstellen stark typisierte POJOs für Client-Bibliothek von OData-Service

Der Olingo Weg scheint zu sein, ein ODataClient Objekt, das dem Benutzer mit einer Reihe von nützlichen Methoden für die Interaktion mit der API bietet. Die ODataClient verwendet eine Reihe von Factory-Methoden, um meine Anfrage zu erstellen. Zum Beispiel ist dies der Code, den ich verwendet habe, um die Customers aus dem Northwind-Beispiel OData-Dienst zu erhalten. client ist eine Instanz der notwendigen ODataClient Klasse.

String serviceRoot = "http://services.odata.org/V4/Northwind/Northwind.svc"; 
URI customersUri = client.newURIBuilder(serviceRoot) 
     .appendEntitySetSegment("Customers").build(); 
ODataRetrieveResponse<ODataEntitySetIterator<ODataEntitySet, ODataEntity>> response = 
     client.getRetrieveRequestFactory().getEntitySetIteratorRequest(customersUri).execute(); 

if (response.getStatusCode() >= 400) { 
    log("Error"); 
    return; 
} 

ODataEntitySetIterator<ODataEntitySet, ODataEntity> iterator = response.getBody(); 

while (iterator.hasNext()) { 
    ODataEntity customer = iterator.next(); 
    log(customer.getId().toString()); 
} 

Ich möchte mit einer stark typisierten Entität aus der Iterator am Ende (das heißt Customer customer = iterator.next()). Ich bin mir jedoch nicht sicher, wie ich das tatsächlich machen soll.

Wenn ich eine Customer Klasse erstellen, die ODataEntity und versuchen, sich ein gegossenes auszuführen wie Customer customer = (Customer) iterator.next() dann ich eine ClassCastException erhalten, da die Objekte in der Iterator sind nur ODataEntity Objekte und wissen nichts über die Customer Unterklasse.

Mein nächster Gedanke war, Generika einzuführen, aber dies erfordert eine Menge Änderungen an der Olingo-Bibliothek, die mich glauben machen lassen, dass es einen besseren Weg gibt, dies zu tun.

ich die Entwickler-Version von Apache Olingo 4 seit der OData-Dienst bin mit OData 4.

Was ich vermisst verwenden müssen?

Antwort

4

Es ist nicht wirklich beworben, aber es gibt heutzutage einen POJO-Generator in Olingo, im source tree am ext/pojogen-maven-plugin. Leider wird zur Verwendung der POJOs eine andere Schicht mit einem anderen Programmiermodell hinzugefügt, die Entitäten im Cache zwischenspeichert und mit dem OData-Service bei einer Flush-Operation synchronisiert. Ich wäre sehr daran interessiert, es an ein konventionelleres Request/Response-Modell auf Basis von Olingos Request Factories anzupassen.

Aber Sie könnten es ausprobieren. In Ihrem Pom gehören pojogen-maven-plugin und odata-client-proxy. Die POJO Generation kann ich die EDM Metadataof den Olingo Auto Beispiel Service an src/main/resources/metadata.xml gespeichert im pom mit

<plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>build-helper-maven-plugin</artifactId> 
     <version>1.8</version> 
     <executions> 
      <execution> 
       <phase>process-sources</phase> 
       <goals> 
        <goal>add-source</goal> 
       </goals> 
       <configuration> 
        <sources> 
         <source>${project.build.directory}/generated-sources</source> 
        </sources> 
       </configuration> 
      </execution> 
     </executions> 
    </plugin> 

    <plugin> 
     <groupId>org.apache.olingo</groupId> 
     <artifactId>pojogen-maven-plugin</artifactId> 
     <version>4.2.0-SNAPSHOT</version> 
     <configuration> 
      <outputDirectory>${project.build.directory}/generated-sources</outputDirectory> 
      <localEdm>${basedir}/src/main/resources/metadata.xml</localEdm> 
      <basePackage>odata.test.pojo</basePackage> 
     </configuration> 
     <executions> 
      <execution> 
       <id>v4pojoGen</id> 
       <phase>generate-sources</phase> 
       <goals> 
        <goal>v4pojoGen</goal> 
       </goals> 
      </execution> 
     </executions> 
    </plugin> 
</plugins> 

Für das Experiment ausgelöst werden. Irgendwie möchte das Plugin einen Inzwischen-OJC-Plugin-Ordner erstellen und ich habe den generierten Java-Code einfach manuell an die richtige Stelle verschoben.

An diesem Punkt haben Sie eine Service.java und Java-Schnittstellen für jede Entität oder einen komplexen Typ im EDM-Modell.

Sie können davon Gebrauch machen einige Einheiten zu lesen wie diese

Service<EdmEnabledODataClient> service = odata.test.pojo.Service.getV4("http://localhost:9080/odata-server-sample/cars.svc"); 
Container container = service.getEntityContainer(Container.class); 
for (Manufacturer m : container.getManufacturers()) { 
    System.out.println(m.getName()); 
} 
+0

Das Plugin funktioniert nicht mit den Service-Metadaten I zu verwenden versucht ist, - hat es mit komplexen .Net Service-Metadaten getestet? –

+0

Ich habe eine JIRA erstellt, um diese @ https://issues.apache.org/jira/browse/OLINGO-885 –

+0

Entschuldigung zu adressieren, aber ich finde keine Dokumente an diesem überall, also ... wissen Sie, ob dieser pojo Generator funktioniert auch für odata v2 Metadaten? – Dominik

Verwandte Themen