在集团型 SAP 系统里,一个很常见的现场是这样的。前端只有一个统一的 SAP Gateway 入口,背后却连接着多套 SAP S/4HANA 或 SAP Business Suite 系统。某个 SAP Fiori 应用打开时,业务数据来自一套后端,OData$metadata也来自这套后端,但负责描述界面语义的 annotation 文件如果意外从另一套系统被取回来,页面未必立刻报 HTTP 错误,真正出现的现象可能更加隐蔽,字段标题不对,Value Help 不对,某些按钮消失,LineItem 排列发生变化,甚至 annotation 中指向的属性在当前 metadata 里根本不存在。
这类问题表面看起来像 SAPUI5 或 SAP Fiori Elements 的 UI 问题,往下追踪却会进入 SAP Gateway Foundation 的路由机制,而这里有一个非常重要的设计原则,metadata 与 annotations 必须保持同步,它们应当来源于同一个 backend system。SAP 官方关于 Vocabulary-Based Annotations 的文档明确说明了这一点,同时给出了通过 Catalog Service 的 origin segment parametero控制 annotation 文件来源的方式。
理解这段机制之前,需要先把 metadata 和 annotation 在 OData 世界里的分工拆开。
$metadata更接近服务的结构契约。它告诉消费端有哪些 EntityType、EntitySet、Property、Association、Navigation Property,