通过 odata-generator-cli 创建 OData 客户端时的异常

问题描述

我想通过 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 - ------------------------------------------------------------

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

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

解决方法

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


与此同时,您已经可以使用 SAP 集成套件(以前称为 SAP 云平台集成,CPI)通过导航到已部署的服务并与 /api/v1/$metadata 交换 API 路径来检索最新的服务元数据。

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

使用显示的元数据和来自 SAP API 业务中心的 Swagger 定义来生成您的 OData 客户端。

,

不,您没有错过任何配置。这确实目前仅支持 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);