【问题标题】:How can I consume an OData4 service in Java using either Olingo or the SDL OData Framework如何使用 Olingo 或 SDL OData 框架在 Java 中使用 OData4 服务
【发布时间】:2016-02-09 17:03:02
【问题描述】:

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

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

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

【问题讨论】:

    标签: java odata olingo


    【解决方案1】:

    对于SDL OData framework,您可以查看此Github Test class,了解如何使用 OData 客户端。

    SDL OData 框架是基于 EDM 类和一个简单的示例来获取所有产品(Product Edm Entity)的样子

    // 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);
    

    【讨论】:

      【解决方案2】:

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

      对于 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 - Create strongly typed POJOs for client library of OData service 我建议我们去那里跟进。

      【讨论】:

      • 使用 odata-client-core 版本 4.0.0-beta-01:ODataClient 客户端 = ODataClientFactory.getV4(); (或 xxx.getV3())
      猜你喜欢
      • 1970-01-01
      • 2013-11-25
      • 2017-03-25
      • 1970-01-01
      • 2016-11-14
      • 2021-08-28
      • 2015-12-03
      • 2013-07-14
      • 2011-08-15
      相关资源
      最近更新 更多