6

我需要使用 Java 中的 OData4 服务,根据OData 网站上的框架列表,两个选择是OlingoSDL Odata Framework。我的问题是这两个项目的文档都集中在编写不消耗服务的服务上。Olingo 站点链接到 2014 年的博客文章,该文章与当前版本的 API 不兼容,我在 SDL github 页面上找不到任何内容。

如果有人可以使用适当的 POJO 对象模型为我提供一个简单的 POST / GET 示例,那就太好了。

我有限的理解是 OData 将有关实际对象模型的任何信息从编译时移动到客户端上的运行时。我很乐意忽略这一点并针对固定对象模型进行编码,因为我们使用的服务不会改变。

4

2 回答 2

8

客户端 API 的文档似乎被 Olingo 忽略了。但是在示例/客户端的GIT 存储库中有一个示例。

基本上,对于 GET,您可以执行以下操作:

String serviceUrl = "http://localhost:9080/odata-server-sample/cars.svc"
String entitySetName = "Manufacturers";

ODataClient client = ODataClientFactory.getClient();
URI absoluteUri = client.newURIBuilder(serviceUri).appendEntitySetSegment(entitySetName).build();
ODataEntitySetIteratorRequest<ClientEntitySet, ClientEntity> request = 
client.getRetrieveRequestFactory().getEntitySetIteratorRequest(absoluteUri);
// odata4 sample/server limitation not handling metadata=full
request.setAccept("application/json;odata.metadata=minimal");
ODataRetrieveResponse<ClientEntitySetIterator<ClientEntitySet, ClientEntity>> response = request.execute(); 
ClientEntitySetIterator<ClientEntitySet, ClientEntity> iterator = response.getBody();

while (iterator.hasNext()) {
     ClientEntity ce = iterator.next();
     System.out.println("Manufacturer name: " + ce.getProperty("Name").getPrimitiveValue());
}

查看 Olingo 代码库中的示例,以获取有关如何检索元数据、处理所有属性等的更多详细信息。

要进行 POST,您可以执行以下操作。(请注意,这不是经过测试的代码,示例 Car 服务是只读的。)首先,您将数据构建为 ClientEntity。你做例如

ClientComplexValue manufacturer = of.newComplexValue("Manufacturer");
manufacturer.add(of.newPrimitiveProperty("Name", of.newPrimitiveValueBuilder().buildString("Ford")));

然后你发送 POST 请求

ODataEntityCreateRequest<ClientEntity> request = client.getCUDRequestFactory().getEntityCreateRequest(absoluteUri, manufacturer);
ODataEntityCreateResponse<ClientEntity> response = request.execute();

所以这不适用于 POJO 类 - 结果类型是 ClientEntity,它将数据呈现为名称/值映射。在 Olingo 上已经有关于该特定主题的另一个未回答的问题 - 为 OData 服务的客户端库创建强类型 POJO, 我建议我们转向那里跟进。

于 2016-02-14T22:12:52.977 回答
1

对于SDL OData 框架,您可以查看这个Github 测试类,了解如何使用 OData 客户端。

SDL OData 框架基于 EDM 类和一个简单的示例来获取所有产品(产品 Edm 实体)看起来像

// Create and configure the client
DefaultODataClient client = new DefaultODataClient();
client.configure(componentsProvider);

//Build the query
ODataClientQuery query = new BasicODataClientQuery.Builder().withEntityType(Product.class).build();

//Execute the query
List<Object> entities = (List<Object>) client.getEntities(requestProperties, query);
于 2016-05-04T09:05:47.537 回答