从本文开始,我们迈出使用事物码 SEGW 开发 OData 服务的第一步。
我们会开发一个能够进行图书管理(Book Management) 的 OData 服务,首先创建一个图书实体的模型,也就是 ABAP Dictionary,事物码 SE11 里创建一个 ABAP 结构 (Structure), 取名为 ZTS_BOOK.
下图是事物码 SE11 的界面:
新建一个 Structure:
我们首先给这个结构创建一个 key 也就是主键字段,字段名为 BOOK_GUID
, 类型的话,选择 ABAP 自带的 RAW 类型。为了能输入这个 ABAP 标准类型,我们点一下 Built-in Type
,然后依次在 Data Type 和 Length 字段里维护 RAW 和 16:
依次维护其他字段:
- BOOK_ID: 记录图书的 ID,类型为 CHAR,长度为 4 个字符。
- BOOK_NAME: 记录图书的名称,类型为 SSTRING, 长度为 20 个字符。
- AUTHOR_ID: 图书的作者 ID,类型为 CHAR, 长度为 4 个字符。
- AUTHOR_NAME: 图书的作者名称,类型为 SSTRING, 长度为 20 个字符。
- STOCK_NUMBER: 图书的库存数量,整型。
然后进入事物码 SEGW,新建一个项目:
项目名称维护成 ZBOOK_MANAGE, Project Type 维护成 Service with SAP Annotations
,点击 Local Object 可以存储到本地 $tmp
开发包中。
然后我们会看到项目文件夹下多出了这几个新的文件夹:
我们对着 Data Model 文件夹下面的 Entity Types 单击右键,从右键菜单选择 Create
.
这一步的目的是创建 OData 服务模型的实体类型,也就是 SAP 帮助文档上所说的 Entity Type.
因为 OData 是一种协议,可以基于很多高级编程语言实现,ABAP 是其中之一,因此采取 ABAP 实现的 OData 服务,其数据模型也是基于 ABAP DDIC 里创建的数据结构。接下来的步骤,我们就会把 SEGW 里创建的 OData 模型的 Entity Type,同 ABAP DDIC Structure 即 ZTS_BOOK 里的字段,建立起一一映射的关系。
Entity Type 的名称,维护成 Book:
点击 ✓
之后,看到如下界面,其中 ABAP Structure
栏下面是空的。
手动输入我们刚刚在 SE11 里创建的 ABAP Structure ZTS_BOOK 之后,使用快捷键 Ctrl + S 保存修改:
此时左边 Entity Type 文件夹下面,就会多出一个节点:Book
双击 Book 文件夹下面的 Properties 文件夹,发现是空的。此时我们要手动维护 Book 这个实体类型的每一个字段。
点击这个 Append Row 按钮,创建一个新的空行:
首先需要为 Entity Type 定义一个主键(key):在 Name 栏下面手动输入 book_guid
, 把 Is Key
的 ✓
打上,表明 book_guid
属性为主键,然后在 Edm Type 字段,从 F4 help 里选择 Edm.Guid
这个类型。
接着需要维护这个属性是否支持在 OData 服务实现里被创建,被修改,被排序和是否允许其值为 Null.
因为 Edm.Guid 类型的值是形如这种16位的数字和字母组合的形式:00163EA720001ED29D9420A624836ED3
,所以显然,这种数据格式一旦创建后,就不应被修改,所以 Updatable
的 ✓
不应该被选取。同理,Sortable
和 Nullable
也不应被选取,因为对 GUID 排序不合理,GUID 也不应该允许 Null 作为初始值存在。
Filterable 即根据该字段搜索,对于 GUID 来说的话也不适合。
但是本教程后续步骤,我们的 OData 服务实现,会支持直接通过 OData 的方式创建新的 Book 数据,因此 Creatable
的 ✓
应该打上。
最后,需要为这个 Entity Type 属性字段,选择一个来自 ABAP 结构 ZTS_BOOK 中的 ABAP 字段。还是从 F4 Value Help 里选择 BOOK_GUID
:
选定之后保存,结果如下:
重复上述步骤,将 ZTS_BOOK 其他的字段,也一一手动维护到 Entity Type Properties
文件夹下:
注意,ABAP DDIC 里的 CHAR 和 SSTRING 类型,在 OData Entity Type 里对应的类型,都为 Edm.String
.
属性维护完毕之后,选中 ZBOOK_MANAGE 项目,从右键菜单里,选择 Check Consistency
,确保没有 Error 即错误消息报出。
上图显示,有两条警告消息(Warning Message):Potential loss of data: EDM type is more restriction. Map instead to the ABAP type 'CHAR[20]'.
这些警告消息的大意是,我们的 book_name
和 author_name
, 选择的 Edm Type 类型为 Edm.String
, 最大长度为 20,我们分别为这两个属性字段,绑定到了 ABAP 结构 ZTS_BOOK 的 BOOK_NAME 和 AUTHOR_NAME 字段,这两个 ABAP 字段的数据类型都是 SSTRING, 因为我们期望这两个字段需要区分大小写。而 SEGW 建议我们映射到类型为 CHAR 20 的 ABAP 字段。
对于这个警告消息,我们可以忽略。
Check Consistency 没有发现错误之后,我们从右键菜单,选择 Generate Runtime
:
弹出来 Model and Service Definition 的对话框。到目前为止,我们只是完成了 OData 模型的创建,这些模型还无法运行起来,还无法被外界消费。因此,我们通过上图的 Generate Runtime
,自动生成 OData 元数据的实现类(MPC, Metadata Provider Class)和 OData 服务业务数据提供类(DPC,Data Provider Class):
点击 ✓
之后,SEGW 就会自动生成 MPC,MPC_EXT 和 DPC,DPC_EXT 四个 ABAP 类,在左边的 Runtime Artifacts 文件夹下就能看见。
MPC 和 DPC 的实现源代码,每当我们对 SEGW 里的工程,做修改之后,重新点击 Generate Runtime 之后,会自动被覆盖掉,代之以当前 SEGW 最新的设置对应的源代码。因此,MPC 和 DPC 并不是理想的开发人员编写业务逻辑的场所。
那么我们如果想对 SEGW 创建的 OData 模型的元数据,必须在 MPC_EXT 这个 ABAP 类里进行编程。MPC_EXT 类是 MPC 类的子类,在 MPC_EXT 里编写的代码,在 Generate Runtime 之后不会被覆盖掉。同理,OData 服务的业务逻辑,也应该编写在 DPC_EXT 类里, 而不是 DPC 类里。
至此我们完成了 SEGW 模型的创建,本教程下一步骤,我们将介绍如何对目前为止创建好的 OData 模型进行测试。
网友评论