RESTful OData API に提供する Java SDK の OData クライアントとして Apache Olingo を使用しています。SDK では、OData エンティティを表す厳密に型指定されたクラスを使用できるようにしたいと考えています。これを簡単に実装するのに苦労しているため、ここで別の戦略が欠けているように感じます。
Olingo の方法はODataClient
、API とやり取りするための便利なメソッドをユーザーに提供するオブジェクトを取得することのようです。私のODataClient
リクエストを構築するために、一連のファクトリメソッドを使用しています。たとえば、これはCustomers
Northwind サンプル OData サービスから取得するために使用したコードです。必要なクラスclient
のインスタンスです。ODataClient
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());
}
イテレータ (すなわち ) から強く型付けされたエンティティで終わりたいと思いますCustomer customer = iterator.next()
。ただし、実際にそれを行う方法はわかりません。
拡張して次のようなキャストを実行しようとするCustomer
クラスを作成すると、イテレータ内のオブジェクトは単なるオブジェクトであり、サブクラスについて何も知らないため、が得られます。ODataEntity
Customer customer = (Customer) iterator.next()
ClassCastException
ODataEntity
Customer
次に考えたのはジェネリックを導入することでしたが、そうすると Olingo ライブラリにかなりの量の変更が必要になり、これを行うためのより良い方法があると思いました。
OData サービスは OData 4 を使用する必要があるため、Apache Olingo 4 の開発バージョンを使用しています。
私は何が欠けていますか?