55.6. RFC 的消息正文
55.6.1. 请求和响应对象
SAP 端点希望收到含有 SAP 请求对象的消息正文,并将返回一个含有 SAP 响应对象的消息正文。SAP 请求和响应是固定的映射数据结构,其中包含命名字段,每个字段都有预定义的数据类型。
请注意,SAP 请求和响应中的命名字段特定于 SAP 端点,每个端点在 SAP 请求中定义参数并响应它。SAP 端点提供工厂方法来创建特定于它的请求和响应对象。
public class SAPEndpoint ... { ... public Structure getRequest() throws Exception; public Structure getResponse() throws Exception; ... }
55.6.2. 结构对象
SAP 请求和响应对象都作为结构对象在 Java 中表示,它支持 org.fusesource.camel.component.sap.model.rfc.Structure
接口。此接口扩展了 java.util.Map
和 org.eclipse.emf.ecore.EObject
接口。
public interface Structure extends org.eclipse.emf.ecore.EObject, java.util.Map<String, Object> { <T> T get(Object key, Class<T> type); }
结构对象中的字段值通过映射界面中字段的 getter 方法访问。此外,结构接口提供了一个类型限制的方法来检索字段值。
结构对象使用 Eclipse Modeling Framework (EMF)在组件运行时实施,并支持框架的 EObject
接口。结构对象的实例已附加元数据,用于定义和限制它提供的字段映射的结构和内容。可以使用 EMF 提供的标准方法访问和内省此元数据。详情请参考 EMF 文档。
尝试获取在结构对象上未定义的参数将返回 null。尝试设置在结构上未定义的参数将抛出异常,并尝试使用不正确的类型设置参数的值。
如以下部分中所述,结构对象可以包含包含复杂字段类型、STRUCTURE
和 TABLE
的值的字段。
创建这些类型的实例并将其添加到结构中是必需的。在以保护结构访问时,根据需要创建这些字段值的实例。
55.6.3. 字段类型
驻留在 SAP 请求或响应的结构对象中的字段可以是 元素 或复杂 的字段。元素字段包含一个 scalar 值,而复杂字段将包含一个或多个元素或复杂类型的字段。
55.6.3.1. Elementary 字段类型
元素字段可以是字符、数字、十六进制或字符串字段类型。下表总结了可能驻留在结构对象中的元素字段类型:
字段类型 | 对应的 Java 类型 | 字节长度 | Unicode byte Length | number Decimals Digits | 描述 |
|
| 1 到 65535 | 1 到 65535 | - | ABAP Type 'C': Fixed sized 字符字符串 |
|
| 8 | 16 | - | ABAP Type 'D': Date (format: YYYYMMDD) |
|
| 1 到 16 | 1 到 16 | 0 到 14 | ABAP Type 'P': 打包的 BCD 号。BCD 号包含每个字节的两个数字。 |
|
| 6 | 12 | - | ABAP Type 'T': Time (format: HHMMSS) |
|
| 1 到 65535 | 1 到 65535 | - | ABAP Type 'X':Fixed sized bytes 数组 |
|
| 1 到 65535 | 1 到 65535 | - | ABAP Type 'N': Fixed sized number string |
|
| 8 | 8 | 0 到 15 | ABAP Type 'F': floating point number |
|
| 4 | 4 | - | ABAP Type 'I': 4 字节整数 |
|
| 2 | 2 | - | ABAP Type 'S': 2 字节整数 |
|
| 1 | 1 | - | ABAP Type 'B': 1 字节整数 |
|
| 8 | 8 | 16 | ABAP Type 'decfloat16': 8 -byte Decimal floating Point number |
|
| 16 | 16 | 34 | ABAP Type 'decfloat34': 16 字节 Decimal 浮动点号 |
|
| 8 | 8 | - | ABAP Type 'G': Variable length 字符字符串 |
|
| 8 | 8 | - | ABAP Type 'Y': Variable length byte array |
55.6.3.2. 字符字段类型
字符字段包含一个固定大小字符字符串,可在底层 JCo 和 ABAP 运行时中使用非统一代码或 Unicode 字符编码。非统一字符字符串按字节编码一个字符。Unicode 字符字符串使用 UTF-16 编码来编码两个字节。字符字段值在 Java 中以 java.lang.String
对象表示,底层 JCo 运行时负责转换为其 ABAP 表示。
字符字段在其关联的 字节长度和
属性中声明其字段长度,该属性决定了每个编码系统中字段字符字符串的长度。
unicodeByteLength
CHAR
-
CHAR
字符字段是一个包含字母数字字符的文本字段,对应于 ABAP 类型 C。 NUM
-
NUM
字符字段是一个数字文本字段,仅包含数字字符,对应于 ABAP 类型 N。 DATE
-
DATE
字符字段是一个 8 个字符日期字段,其中年、月份和日期格式为YYYYMMDD
,对应于 ABAP 类型 D。 时间
-
TIME
字符字段是一个 6 个字符时间字段,格式为HHMMSS
,对应于 ABAP 类型 T。
55.6.3.3. 数字字段类型
number 字段包含一个数字。支持以下数字字段类型:
INT
-
INT
number 字段是一个整数字段,作为 4 字节整数值存储在底层 JCo 和 ABAP 运行时,对应于 ABAP 类型 I。INT
字段值以java.lang.Integer
对象的形式表示。 INT2
-
INT2
数字字段是作为 2 字节整数值存储在底层 JCo 和 ABAP 运行时中的整数字段,对应于 ABAP 类型 S。INT2
字段值以java.lang.Integer
对象的形式表示。 INT1
-
INT1
字段是一个整数字段,作为 1 字节整数值存储在底层 JCo 和 ABAP 运行时值中,对应于 ABAP 类型 B。INT1
字段值以java.lang.Integer
对象的形式表示。 浮点值
-
FLOAT
字段是一个二进制浮动点号字段,存储在底层 JCo 和 ABAP 运行时中的 8 字节双值,对应于 ABAP 类型 F。FLOAT
字段声明字段的值包含在其关联的十进制属性中。如果是FLOAT
字段,这个十进制属性可在 1 到 15 位之间具有值。FLOAT
字段值在 Java 中表示为java.lang.Double
对象。 BCD
-
BCD
字段是一个二进制代码十进制字段,存储在底层 JCo 和 ABAP 运行时中的 1 到 16 字节数字,对应于 ABAP 类型 P。压缩的数字会为每个字节存储两个十进制数字。BCD
字段在其关联的字节长度和
属性中声明其字段长度。如果是unicodeByteLength
BCD
字段,这些属性可以在 1 到 16 字节之间具有值,并且这两个属性都具有相同的值。BCD
字段声明字段的值包含在其关联的十进制属性中的十进制数字。如果是BCD
字段,这个十进制属性可在 1 到 14 位之间具有值。BCD
字段值在 Java 中表示为java.math.BigDecimal
。 DECF16
-
DECF16
字段是一个十进制浮动点,存储为底层 JCo 和 ABAP 运行时的 8 字节 IEEE 754 十进制浮动点值,对应于 ABAP 类型decfloat16
。DECF16
字段的值有 16 十进制数字。DECF16
字段的值在 Java 中表示为java.math.BigDecimal
。 DECF34
-
DECF34
字段是一个十进制浮动点,存储为底层 JCo 和 ABAP 运行时的 16 字节 IEEE 754 十进制浮动点值,对应于 ABAP 类型decfloat34
。DECF34
字段的值具有 34 十进制数字。DECF34
字段的值在 Java 中表示为java.math.BigDecimal
。
55.6.3.4. 十六进制字段类型
hex 字段包含原始二进制数据。支持以下十六进制字段类型:
BYTE
-
BYTE
字段是一个固定大小的字符串,作为字节数组存储在底层 JCo 和 ABAP 运行时,对应于 ABAP 类型 X。BYTE
字段在其关联字节Length 和
属性中声明其字段长度。如果是unicodeByteLength
BYTE
字段,这些属性可以在 1 到 65535 字节之间具有值,并且这两个属性都具有相同的值。BYTE
字段的值在 Java 中以byte[]
对象表示。
55.6.3.5. 字符串字段类型
字符串字段引用变量值。在运行时前,该字符串值的长度不会被修复。字符串值的存储在底层 JCo 和 ABAP 运行时动态创建。字符串字段本身的存储已被修复,仅包含字符串标头。
字符串
-
STRING
字段引用存储在底层 JCo 和 ABAP 运行时中的字符字符串作为 8 字节值。它对应于 ABAP 类型 G。STRING
字段的值在 Java 中以java.lang.String
对象表示。 XSTRING
-
XSTRING
字段引用存储在底层 JCo 和 ABAP 运行时中的字节字符串作为 8 字节值。它对应于 ABAP 类型 Y。STRING
字段的值在 Java 中以byte[]
对象表示。
55.6.3.6. 复杂字段类型
复杂的字段可以是 structure 或 table 字段类型。下表总结了这些复杂的字段类型。
字段类型 | 对应的 Java 类型 | 字节长度 | Unicode byte Length | number Decimals Digits | 描述 |
|
| 单个字段字节长度总数 | 单个字段 Unicode 字节长度总数 | - | ABAP Type 'u' 和 'v': Heterogeneous Structure |
|
| 行结构的字节长度 | 行结构的 Unicode 字节长度 | - | ABAP Type 'h': Table |
55.6.3.7. struct 字段类型
STRUCTURE
字段包含一个结构对象,并作为 ABAP 结构记录存储在底层 JCo 和 ABAP 运行时。它对应于 ABAP 类型 u
或 v
。STRUCTURE
字段的值表示在 Java 中,作为带有接口 org.fusesource.camel.component.sap.model.rfc.Structure
的结构对象。
55.6.3.8. 表字段类型
TABLE
字段包含一个表对象,并作为 ABAP 内部表存储在底层 JCo 和 ABAP 运行时中。它对应于 ABAP 类型 h
。字段的值在 Java 中由一个带有接口 org.fusesource.camel.component.sap.model.rfc.Table
的表对象表示。
55.6.3.9. 表对象
表对象是一个 homogeneous 列表数据结构,其中包含具有相同结构的结构对象行。此接口扩展了 java.util.List
和 org.eclipse.emf.ecore.EObject
接口。
public interface Table<S extends Structure> extends org.eclipse.emf.ecore.EObject, java.util.List<S> { /** * Creates and adds a table row at the end of the row list */ S add(); /** * Creates and adds a table row at the index in the row list */ S add(int index); }
表对象中的行列表通过列表接口中定义的标准方法访问和管理。此外,表接口提供了两种工厂方法,用于创建和添加结构对象到行列表中。
表对象使用 Eclipse Modeling Framework (EMF)在组件运行时实施,并支持框架的 EObject 接口。表对象的实例已附加元数据,用于定义和限制它提供的行的结构和内容。可以使用 EMF 提供的标准方法访问和内省此元数据。详情请参考 EMF 文档。
尝试添加或设置错误类型的行结构值将抛出异常。