Aktuell beschäftige ich mich damit, wie Daten strukturiert von einer Java EE Anwendung abgerufen und einem Client zur Verfügung gestellt werden können. Bisher habe ich RESTful Web Services implementiert, welche die Daten im JSON-Format geliefert bzw. verarbeiten haben. Hierzu wurde z. B. das Jersey Framework (Referenzimplementierung) verwendet, welches die Java API for RESTful Web Services (JAX-RS) Spezifikation implementiert. Dabei ist zwar JSON ist ein kompaktes und schlankes Datenaustauschformat, jedoch war es hier umständlich weitere Metadaten zu integrieren.
Auf der Suche nach möglichen Lösungansätzen bin ich auf das Open Data Protocol (OData) gestoßen. Dieses Protokol wurde von Microsoft entworfen und definiert einen Standard, um einen strukturierten Datenaustausch zu ermöglichen. Die Schwerpunkte des Protokols liegen grundsätzlich bei der Server-zu-Server-Kommunikation und der Möglichkeit, einen angebotenen Service mittels einen Servicedokuments und des Datenmodells (EDM) einzubinden zu können.
Die ersten OData Versionen 1-3 wurden per Microsoft Open Specification Promise freigegeben. Die Version 4.0 wurde nach der Übergabe an OASIS und dessen Weiterentwicklung, am 26. Februar 2014 freigegeben.
Im OData-Standard werden u. a. die Definition des Datenmodells per Entity Data Model (EDM), der Datenaustausch mittels Services im Service Document und die Datenformate wie z. B. Atom und JSON festgelegt. Zusätzlich sind Funktionen in Form der System Query Options, Service Operations und Batch Processing definiert. Dadurch ist es mittels Query-Anfragen ($filter, $select, $top ..) möglich, die Datenmenge einzugrenzen und somit nur die notwendigen Daten abzurufen. Die Bearbeitung der Daten kann mit CRUD-Operationen nach den REST-Prinzipien erfolgen.
OData Java-Bibliotheken
Die Recherche nach Java-Bibliotheken, welche die OData V4 Spezifikation implementieren, war leider etwas ernüchternd. Im Vergleich zu anderen Programmiersprachen (wie z. B. .NET) konnte ich nur eine Handvoll an Bibliotheken finden, die erstmal vielversprechend aussahen. Leider stellte sich schnell heraus, dass die Meisten davon nur die OData Spezfikationen von Version 1-3 implementiert haben. In die engere Auswahl kam somit mich eigentlich nur das SDL OData Framework und die Apache Olingo Projekt.
SDL OData Framework
Das SDL OData Framework implementiert die OData V4 Spezifikation und bietet nicht nur die serverseitige Komponente, sondern auch die Möglichkeit zur Entwicklung eines OData Java Clients. Ein weiterer Pluspunkt ist, dass es sowohl eine JPA Erweiterung gibt, sowie die Möglichkeit das EDM mittels Java-Annotationen zu definieren. Leider scheint dieses Framework hauptsächlich in Verbindung mit Spring bzw. Spring Boot gedacht zu sein und ist somit im Java EE Umfeld eher umständlich einzusetzen.
Apache Olingo Bibliotheken
Das Apache Olingo Projekt besteht aus einer Sammlung von Java und JavaScript Bibliotheken und bietet aktuell Support für die OData V2 und die OData V4 Version. Leider bietet aktuell nur die OData V2 Implementierung einen JPA Prozessor und die Unterstützung für Java-Annotationen zur Definition des EDM an. Die Implementierung des V4 Standards selbst, scheint für mich aber ausgereift, deshalb lohnte es sich, die Bibliotheken etwas detailierter zu betrachten.
Beispielprojekt: Java EE – OData V4 Service mittels Apache Olingo
Auf Basis des Tutorials „Basic Tutorial: Create an OData V4 Service with Olingo“ habe ich ein kleines Beispielprojekt erstellt. Die Java EE Web-Anwendung stellt einen OData V4 Service bereit, welcher mit Hilfe der Apache Olingo Bibliothek erstellt wurde.
Eigene EDM Java-Annotationen
Um die Erstellung des OData Services etwas flexibler zu haben, wurden eigene Java-Annotationen und ein spezieller Annotationen-Prozessor erstellt, um auch in Version 4 die Definition des EDM mittels Annotationen zu ermöglichen.
Quellcode
Der komplette Quellcode für dieses Projekt, kann in meinem GitHub Repository gefunden werden:
GitHub: ODataV4 – JavaEE – Example – Apache Olingo