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

标签 java odata olingo

我使用 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())。但是,我不确定如何真正做到这一点。

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

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

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

我错过了什么?

最佳答案

它并没有真正做广告,但现在 Olingo 中有一个 POJO 生成器,在 source tree 中在 ext/pojogen-maven-plugin。不幸的是,为了使用 POJO,添加了具有不同编程模型的另一层,它将实体缓存在内存中并在刷新操作时与 OData 服务同步。我真的很想将其改编为基于 Olingos 请求工厂的更传统的请求/响应模型。

但是,您可以尝试一下。在您的 pom 中包含 pojogen-maven-plugin 和 odata-client-proxy。 可以在 pom 中触发 POJO 生成

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

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

此时,对于 EDM 模型中的每个实体或复杂类型,您都有一个 Service.java 和 Java 接口(interface)。

你可以利用它来读取像这样的一些实体

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());
}

关于java - Olingo - 为 OData 服务的客户端库创建强类型的 POJO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24481630/

相关文章:

java最长回文不工作

java - gui 中新线程的问题

java - 如何找到根元素值?

java - 如何创建重叠的背景和前景图像?

asp.net - 找不到与所有表的请求 URI (...) 匹配的 HTTP 资源

asp.net-web-api - 如何在 OData 中的 $expand 上跳过、选择、顶部?

wcf - 如果我在AddObject上添加数据,如何返回ID?

java - 如何从 Olingo ReferenceProcessor 中的 updateReference 请求获取引用的实体?

tomcat - 如何关闭 Apache Olingo OData 2.0 缓存?

olingo - 在 Apache Olingo for OData v4 中使用注释