【问题标题】:Exceptions when creating OData client via odata-generator-cli通过 odata-generator-cli 创建 OData 客户端时出现异常
【发布时间】:2021-01-08 08:31:29
【问题描述】:

我想通过 odata-generator-cli 3.35.0 在 Java 中创建一个 OData 客户端。

使用 .edmx 和关注 Service from Business Hub 的 swagger 文件。

正在生成 OData 客户端,但出现异常:

[main] INFO com.sap.cloud.sdk.datamodel.odata.generator.ODataToVdmGenerator - Processing 1 OData service...
[main] INFO com.sap.cloud.sdk.datamodel.odata.generator.ODataToVdmGenerator - Processing OData service 'Integration Content' at /cpi/api/v1
[main] INFO com.sap.cloud.sdk.datamodel.odata.generator.NamespaceClassGenerator -   Found entity type IntegrationDesigntimeArtifact from set IntegrationDesigntimeArtifacts
[main] INFO com.sap.cloud.sdk.datamodel.odata.generator.NamespaceClassGenerator -   Found entity type RuntimeArtifactErrorInformation from set RuntimeArtifactErrorInformations
[main] INFO com.sap.cloud.sdk.datamodel.odata.generator.NamespaceClassGenerator -   Found entity type Configuration from set Configurations
[main] INFO com.sap.cloud.sdk.datamodel.odata.generator.NamespaceClassGenerator -   Found entity type Resource from set Resources
[main] INFO com.sap.cloud.sdk.datamodel.odata.generator.NamespaceClassGenerator -   Found entity type IntegrationRuntimeArtifact from set IntegrationRuntimeArtifacts
[main] INFO com.sap.cloud.sdk.datamodel.odata.generator.NamingContext - Found more than one occurrence of the Java identifier type. The new identifier has been renamed to type_2
[main] INFO com.sap.cloud.sdk.datamodel.odata.generator.NamespaceClassGenerator -   Found entity type IntegrationPackage from set IntegrationPackages
[main] INFO com.sap.cloud.sdk.datamodel.odata.generator.NamespaceClassGenerator -   Found entity type ServiceEndpoint from set ServiceEndpoints
[main] INFO com.sap.cloud.sdk.datamodel.odata.generator.NamespaceClassGenerator -   Found entity type EntryPoint from set EntryPoints
[main] INFO com.sap.cloud.sdk.datamodel.odata.generator.NamingContext - Found more than one occurrence of the Java identifier type. The new identifier has been renamed to type_2
[main] INFO com.sap.cloud.sdk.datamodel.odata.generator.NamespaceClassGenerator -   Found entity type Definition from set APIDefinitions
[main] INFO com.sap.cloud.sdk.datamodel.odata.generator.NamespaceClassGenerator -   Found entity type ValueMappingDesigntimeArtifact from set ValueMappingDesigntimeArtifacts
[main] INFO com.sap.cloud.sdk.datamodel.odata.generator.NamespaceClassGenerator -   Found entity type ValMapSchema from set ValMapSchema
[main] WARN com.sap.cloud.sdk.datamodel.odata.generator.ODataToVdmGenerator - Error in file IntegrationContent; unable to generate all VDM classes.
com.sap.cloud.sdk.datamodel.odata.generator.ODataGeneratorReadException: org.apache.olingo.odata2.api.edm.EdmException: An exception occurred.
        at com.sap.cloud.sdk.datamodel.odata.generator.EdmService$TypedAdapter.getType(EdmService.java:317)
        at com.sap.cloud.sdk.datamodel.odata.generator.NamespaceClassGenerator.processNavigationProperties(NamespaceClassGenerator.java:1098)
        at com.sap.cloud.sdk.datamodel.odata.generator.NamespaceClassGenerator.processEntitySet(NamespaceClassGenerator.java:891)
        at com.sap.cloud.sdk.datamodel.odata.generator.EntitySetProcessor.processEntitySets(EntitySetProcessor.java:74)
        at com.sap.cloud.sdk.datamodel.odata.generator.CodeModelClassGenerator.processService(CodeModelClassGenerator.java:102)
        at com.sap.cloud.sdk.datamodel.odata.generator.ODataToVdmGenerator.createCodeModelForServices(ODataToVdmGenerator.java:133)
        at com.sap.cloud.sdk.datamodel.odata.generator.ODataToVdmGenerator.generate(ODataToVdmGenerator.java:98)
        at com.sap.cloud.sdk.datamodel.odata.generator.DataModelGenerator.execute(DataModelGenerator.java:797)
        at com.sap.cloud.sdk.datamodel.odata.generator.DataModelGeneratorCli.run(DataModelGeneratorCli.java:206)
        at com.sap.cloud.sdk.datamodel.odata.generator.DataModelGeneratorCli.main(DataModelGeneratorCli.java:188)
Caused by: org.apache.olingo.odata2.api.edm.EdmException: An exception occurred.
        at org.apache.olingo.odata2.core.edm.provider.EdmAssociationEndImplProv.getEntityType(EdmAssociationEndImplProv.java:51)
        at org.apache.olingo.odata2.core.edm.provider.EdmNavigationPropertyImplProv.getType(EdmNavigationPropertyImplProv.java:44)
        at com.sap.cloud.sdk.datamodel.odata.generator.EdmService$TypedAdapter.getType(EdmService.java:314)
        ... 9 more
[main] INFO com.sap.cloud.sdk.datamodel.odata.generator.ODataToVdmGenerator - Generating Java classes to C:\Users\W4ff3l\Downloads\odata-gen\trg
[main] INFO com.sap.cloud.sdk.datamodel.odata.generator.DataModelGeneratorCli - ------------------------------------------------------------
[main] WARN com.sap.cloud.sdk.datamodel.odata.generator.DataModelGeneratorCli -  Generator SUCCEEDED but had the following 1 warning messages:
[main] WARN com.sap.cloud.sdk.datamodel.odata.generator.DataModelGeneratorCli - Error in file IntegrationContent; unable to generate all VDM classes.
[main] INFO com.sap.cloud.sdk.datamodel.odata.generator.DataModelGeneratorCli - ------------------------------------------------------------

导航似乎有问题,但我不知道如何调试或解决这个问题。

要复制问题,请从 Business Hub 下载 .edmx 和 .json 并在生成器中使用它们。

【问题讨论】:

  • 感谢您报告此事。我现在正尝试在我的系统上重现此异常,以便进一步探索。
  • 我可以重现该问题,到目前为止,我的观察是元数据文档中未定义实体类型“com.sap.hci.api.ValMap”。一旦我有更多信息,将在这里更新。

标签: sap-cloud-sdk


【解决方案1】:

缺少实体类型的官方修复程序目前正在我们的发布管道中,并将 大概可以在大约 4 周后通过 SAP API Business Hub 获得。


与此同时,您已经可以使用 SAP Integration Suite(以前称为 SAP Cloud Platform Integration,CPI)检索最新的服务元数据,方法是导航到已部署的服务并与 /api/v1/$metadata 交换 API 路径。

例如,假设您的服务在 https://<YourAccountShortName>-tmn.<SSLHost>.<Landscapehost> 运行,只需导航到 https://<YourAccountShortName>-tmn.<SSLHost>.<Landscapehost>/api/v1/$metadata

将显示的元数据与 SAP API Business Hub 中的 Swagger 定义一起使用来生成您的 OData 客户端。

【讨论】:

  • 我不确定我是否错过了此处的配置,但是将元数据与 swagger 定义一起使用并不能提供所有请求。例如,swagger 定义包括获取一个包“/IntegrationPackages('{Id}')/IntegrationDesigntimeArtifacts”的所有工件的请求,但在生成客户端后没有为此提供方法。
【解决方案2】:

该 SCP 服务的元数据存在问题,缺少实体类型。 如果可以从 API Business Hub 下载更正的元数据,我将更新此答案。

【讨论】:

    【解决方案3】:

    不,您没有错过任何配置。这确实目前仅支持 OData v4 服务,是 Cloud SDK 中 OData v2 的功能差距。但是您可以利用我们的通用 OData 客户端来实现这一点。

    这里是带有解释的示例代码:

    ODataEntityKey entityKey = new ODataEntityKey(ODataProtocol.V2);
    entityKey.addKeyProperty("keyId", "keyValue");
    
    // creating resource path
    final ODataResourcePath resourcePath = ODataResourcePath.of("IntegrationPackages", entityKey)
            .addSegment("IntegrationDesigntimeArtifacts"); // here "IntegrationPackages" is the entityCollection
    
    // creating read request
    ODataRequestRead request = new ODataRequestRead(Service.DEFAULT_SERVICE_PATH, resourcePath,"encodedQueryStringIfAny", ODataProtocol.V2);
    
    //executing
    final ODataRequestResultGeneric result = request.execute(HttpClientAccessor.getHttpClient(destination));
    
    //response parsing
    result.asList(IntegrationDesigntimeArtifact.class);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-15
      • 2015-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多