SAP CDS OData服务$metadata缺失UI.lineItem注解问题咨询
我创建了带有UI注解的CDS实体并发布为OData服务,代码示例如下:
@AbapCatalog.viewEnhancementCategory: [#NONE] @AccessControl.authorizationCheck: #NOT_REQUIRED @EndUserText.label: 'Test' @Metadata.ignorePropagatedAnnotations: true @OData.publish: true define view entity Z_Test_View as select from acdoca { key cast(rldnr as rldnr preserving type) as rldnr, key cast(rbukrs as bukrs preserving type) as rbukrs, key gjahr, key belnr, key docln, @UI.lineItem: [{ position: 10, value: 'ryear' }] ryear, }
此外,我为其创建了类型为OData V2 - UI的服务绑定。原本预期UI注解会出现在OData服务的$metadata中,但实际缺失。通过Eclipse预览调试发现,该注解存在于请求/sap/opu/odata/IWFND/CATALOGSERVICE;v=2/Annotations(TechnicalName='Z_TEST_VIEW_BND_VAN',Version='0001')的响应中:
<edmx:DataServices> <Schema Namespace="z_test_view_bnd_van.v1" xmlns="http://docs.oasis-open.org/odata/ns/edm"> <Annotations Target="cds_z_test_view_srv.Z_Test_ViewType"> <Annotation Term="UI.LineItem"> <Collection> <Record Type="UI.DataField"> <PropertyValue Property="Value" Path="ryear"/> </Record> </Collection> </Annotation> </Annotations> </Schema> </edmx:DataServices>
请问为何需要额外发起该请求,且UI注解未包含在OData服务的$metadata中?
1. OData V2 注解的分离存储机制
OData V2 原生未定义注解嵌入核心元数据的规范,SAP 在实现OData V2服务时,将UI类注解(如@UI、@EndUserText)与核心元数据($metadata)分离存储。核心元数据仅保留实体结构、字段类型、主键等基础服务信息,UI相关注解则单独存入SAP Gateway的注解仓库,通过Catalog Service的专属接口对外暴露。
2. OData V2 - UI服务绑定的设计逻辑
你选择的OData V2 - UI绑定类型,正是为适配这种分离模式而生:
- 该类型会自动将CDS中的UI注解同步到Gateway注解目录,而非直接嵌入服务的
$metadata。 - 这种设计能减小核心元数据体积,同时让UI注解可独立于服务元数据维护更新,避免频繁修改核心服务定义。
3. 单独请求Catalog Service注解接口的原因
SAP Fiori等前端框架在消费OData V2服务时,会自动调用Catalog Service的注解接口获取UI配置(如字段显示顺序、标签)。这种分离模式是SAP的最佳实践:
- 核心服务专注数据提供,UI配置通过专门接口分发,职责划分更清晰。
- 支持注解版本化管理(通过
Version='0001'参数),便于迭代和回滚。
可选:让注解出现在$metadata中的方法
如果需要将UI注解直接嵌入$metadata,可将服务绑定类型改为OData V2 - Web API。该类型会把所有注解包含进核心元数据,但会增加$metadata体积,且注解变更需重新发布服务,灵活性不如分离模式。
内容的提问来源于stack exchange,提问作者Annie W.

