为OData服务的客户端库创建强类型的POJO

我使用Apache Olingo作为Java SDK的OData客户端,我将提供RESTful OData API。 在SDK中,我希望能够强类型化类来表示OData实体。 我很难轻易实现,因此我觉得我在这里错过了一个不同的策略。

Olingo的方式似乎是获得一个ODataClient对象,该对象为用户提供了一组与API进行交互的有用方法。 ODataClient使用一堆工厂方法来构建我的请求。 例如,这是我用来从Northwind样本OData服务中获得Customers的代码。 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() )。 但是,我不确定如何实际做到这一点。

如果我创建了一个扩展ODataEntity并尝试执行诸如Customer customer = (Customer) iterator.next()类的类的Customer类,那么我得到一个ClassCastException因为迭代器中的对象只是ODataEntity对象,并且对Customer子类一无所知。

我的下一个想法是引入泛型,但这样做需要对Olingo库进行大量的修改,这使我认为有更好的方法来做到这一点。

我使用Apache Olingo 4的开发版本,因为OData服务必须使用OData 4。

我错过了什么?


它并没有真正做广告,但是现在在Olingo有一个POJO生成器,在ext / pojogen-maven-plugin的源代码树中。 不幸的是,对于使用POJO,添加了具有不同编程模型的另一个层,该层保存存储器中缓存的实体并在刷新操作中与OData服务同步。 我会真正有兴趣将它适用于基于Olingos Request Factories的更传统的请求/响应模型。

但是,你可以尝试一下。 在你的pom中包括pojogen-maven-plugin和odata-client-proxy。 POJO世代可以在pom中被触发

    <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>

对于实验,我在src / main / resources / metadata.xml中存储了Olingo Car示例服务的EDM Metadata。 不知怎的,插件想要创建一个inbetween ojc-plugin文件夹,并且我只是将生成的Java代码手动移动到适当的位置。

此时,您将在EDM模型中为每个实体或复杂类型提供Service.java和Java接口。

你可以利用它来阅读这样的实体

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());
}
链接地址: http://www.djcxy.com/p/80121.html

上一篇: Create strongly typed POJOs for client library of OData service

下一篇: Node.js child processes and pipes