2017-01-06 2 views
-1

Ich folgte einige example, in denen wir OData-Service mit Olingo von Java (Maven-Projekt) bauen können. Das bereitgestellte Beispiel hat keine Datenbankinteraktion. Sie verwenden einige Storage.class, die fest codierte Daten enthält.OData-Service mit Olingo V4 und MySQL Datenbankverbindung

Sie können Beispielcode auf git finden. Bitte beachten Sie das Beispiel p0_all in der angegebenen URL.

Hat jemand weiß, wie wir git Beispiel mit einiger Datenbank verbinden und darüber hinaus CRUD-Operationen

Bitte führen Sie mir mit einigen guten Beispielen oder Konzept helfen.

Wir danken Ihnen im Voraus.

Antwort

1

ich einen OData Produzent mit Olingo vor kurzem gebaut und fand ähnlich frustriert mich. Ich denke, dass ein Teil des Problems darin besteht, dass es wirklich viele verschiedene Möglichkeiten gibt, einen OData-Service mit Olingo zu erstellen, und der Datenzugriffsbereich liegt in der Hand des Entwicklers, der in seinem eigenen Projekt aussortiert wird.

Zuerst benötigen Sie eine Anwendung, die eine Datenbankverbindung eingerichtet hat. Wenn Sie also Olingo völlig ignorieren, sollten Sie eine App haben, die sich mit einer Datenbank verbindet und diese abfragen kann. Wenn Sie sich nicht sicher sind, wie Sie eine Java-Anwendung erstellen, die eine MySQL-Datenquelle abfragen kann, sollten Sie Google für Tutorials besuchen, die mit diesem Problem zusammenhängen und nichts mit Olingo zu tun haben.

Als nächstes müssen Sie die Methoden und Abfragen schreiben CRUD-Operationen in der Anwendung auszuführen. Auch diese Methoden haben nichts mit Olingo zu tun.

Wo Olingo zu kommen beginnt, ist Klassen in Ihrer Implementierung der Prozessor zu spielen. EntityCollectionProcessor, EntityProcessor usw. (beachten Sie, dass es andere Probleme wie Ihr CsdlEntityTypes und Schema/Servicedokument usw. einrichten, aber die sind nicht in den Anwendungsbereich Ihrer Frage)

Ermöglicht durch einen Blick auf EntityCollectionProcessor zu starten. Wenn Sie die Klasse EntityCollectionProcessor implementieren, müssen Sie die Funktion readEntityCollection() außer Kraft setzen. Der Zweck dieser Funktion ist es, die ODATA URI für die Entität Namen zu analysieren, eine EntityCollection für diesen Entity, holen und dann die EntityCollection ODATA in eine konforme Antwort serialisieren. Hier ist die Implementierung von readEntityCollection() aus Ihrem Beispiel Link:

public void readEntityCollection(ODataRequest request, ODataResponse response, UriInfo uriInfo, ContentType responseFormat) 
throws ODataApplicationException, SerializerException { 

    // 1st we have retrieve the requested EntitySet from the uriInfo object 
    // (representation of the parsed service URI) 
    List<UriResource> resourcePaths = uriInfo.getUriResourceParts(); 
    UriResourceEntitySet uriResourceEntitySet = (UriResourceEntitySet) resourcePaths.get(0); 
    // in our example, the first segment is the EntitySet 
    EdmEntitySet edmEntitySet = uriResourceEntitySet.getEntitySet(); 

    // 2nd: fetch the data from backend for this requested EntitySetName 
    // it has to be delivered as EntityCollection object 
    EntityCollection entitySet = getData(edmEntitySet); 

    // 3rd: create a serializer based on the requested format (json) 
    ODataSerializer serializer = odata.createSerializer(responseFormat); 

    // 4th: Now serialize the content: transform from the EntitySet object to InputStream 
    EdmEntityType edmEntityType = edmEntitySet.getEntityType(); 
    ContextURL contextUrl = ContextURL.with().entitySet(edmEntitySet).build(); 

    final String id = request.getRawBaseUri() + "/" + edmEntitySet.getName(); 
    EntityCollectionSerializerOptions opts =  EntityCollectionSerializerOptions.with().id(id).contextURL(contextUrl).build(); 
    SerializerResult serializerResult = serializer.entityCollection(serviceMetadata, edmEntityType, entitySet, opts); 
    InputStream serializedContent = serializerResult.getContent(); 

    // Finally: configure the response object: set the body, headers and status code 
    response.setContent(serializedContent); 
    response.setStatusCode(HttpStatusCode.OK.getStatusCode()); 
    response.setHeader(HttpHeader.CONTENT_TYPE, responseFormat.toContentTypeString()); 
} 

können Sie ignorieren (und Wiederverwendung) alles in diesem Beispiel mit Ausnahme des „2.“ Schritt:

EntityCollection entitySet = getData(edmEntitySet);

Diese Codezeile ist wo Olingo endlich mit unserem zugrunde liegenden System zu interagieren beginnt, und das Muster, das wir hier sehen, informiert darüber, wie wir den Rest unserer CRUD-Operationen einrichten sollten.

Die Funktion getData(edmEntitySet) können Sie in jeder Klasse, was Sie wollen, sein. Die einzige Einschränkung ist, dass ein EntityCollection zurückgegeben werden muss. Sie müssen also eine Funktion aufrufen, die Ihre MySQL-Datenbank abfragt und alle Datensätze für die angegebene Entität zurückgibt (mit dem String-Namen der Entität). Sobald Sie eine Liste oder einen Satz (oder was auch immer) Ihrer Datensätze haben, müssen Sie sie in eine EntityCollection konvertieren.

Nebenbei denke ich, dass dies wahrscheinlich die Verbindung zwischen den Olingo-Beispielen und der realen Anwendung ist. Der Code hinter dem getData(edmEntitySet); Anruf kann in unendlich verschiedenen Arten architected werden, je nach Design-Muster in dem zugrunde liegenden System verwendet (MVC etc.), Styling Entscheidungen, Skalierbarkeit Anforderungen usw.

Hier ist ein Beispiel dafür, wie ich schaffte ein EntityCollection von einem List, die aus meiner Anfrage (bedenken Sie, dass ich Sie wissen, gehe davon aus, wie Sie Ihre MySQL-Datenquelle abfragen und haben bereits eine Funktion, die alle Datensätze für eine bestimmte Einheit abruft codiert) zurückgegeben:

private List<Foo> getAllFoos(){ 
    // ... code that queries dataset and retrieves all Foo records 
} 

// loop over List<Foo> converting each instance of Foo into and Olingo Entity 
private EntityCollection makeEntityCollection(List<Foo> fooList){ 
    EntityCollection entitySet = new EntityCollection(); 

    for (Foo foo: fooList){ 
     entitySet.getEntities().add(createEntity(foo)); 
    } 

    return entitySet; 
} 

// Convert instance of Foo object into an Olingo Entity 
private Entity createEntity(Foo foo){ 
    Entity tmpEntity = new Entity() 
      .addProperty(createPrimitive(Foo.FIELD_ID, foo.getId())) 
      .addProperty(createPrimitive(Foo.FIELD_FOO_NAME, foo.getFooName())); 

    return tmpEntity; 
} 

für Just added Klarheit, getData(edmEntitySet) könnte wie folgt aussehen:

Wenn Sie ein Olingo-Beispiel finden, das eine DataProvider-Klasse verwendet, gibt es einige grundlegende Beispiele dafür, wie Sie die // ...code to determine which query to call based on entity name einrichten können. Ich habe am Ende dieses Muster stark mit Java-Reflektion modifiziert, aber das ist völlig unabhängig von Ihrer Frage.

So ist getData(edmEntitySet) eine Funktion, die eine Entität Namen hat, fragt die Datenquelle für alle Datensätze dieser Entität (Zurückgeben eines List<Foo>) und wandelt dann das List<Foo> in eine EntityCollection. Die EntityCollection wird durch den Aufruf der createEntity() Funktion gemacht, die die Instanz meines Foo Objekts übernimmt und es in einen Olingo Entity verwandelt. Die EntityCollection wird dann an die readEntityCollection()-Funktion zurückgegeben und kann ordnungsgemäß serialisiert und als oData-Antwort zurückgegeben werden.

Dieses Beispiel deckt ein wenig das Architekturproblem auf, das Olingo mit seinen eigenen Beispielen hat. In meinem Beispiel ist Foo ein Objekt mit Konstanten, die zur Identifizierung der Feldnamen verwendet werden, die von Olingo zum Generieren des oData-Schemas und des Servicedokuments verwendet werden. Dieses Objekt hat eine eigene Methode CsdlEntityType, sowie einen Konstruktor, seine eigenen Eigenschaften und Getter/Setter etc. Sie müssen Ihr System nicht auf diese Weise einrichten, aber für die Skalierbarkeitsanforderungen meines Projekts ist dies wie Ich entschied mich, Dinge zu tun.

Dies ist das allgemeine Muster, das Olingo verwendet. Überschreiben Sie Methoden einer Schnittstelle und rufen Sie dann Funktionen in einem separaten Teil Ihres Systems auf, die mit Ihren Daten in der gewünschten Weise interagieren. Dann wandeln Sie die Daten in lesbare Olingo-Objekte um, damit sie alles tun können, was "oData stuff" in der Antwort benötigt. Wenn Sie CRUD für eine einzelne Entität implementieren möchten, müssen Sie EntityProcessor und die verschiedenen CRUD-Methoden implementieren. Innerhalb dieser Methoden müssen Sie die Funktionen in Ihrem System aufrufen (völlig unabhängig von jedem Olingo-Code), die create(), read() (Einheit), update() oder delete().

Verwandte Themen