级别: 中级 Zhi Qiu Xie, 软件工程师, IBM Zi Hui Duan, 软件工程师, IBM
2009 年 9 月 09 日 本文描述了 WebSphere® Process Server 中的业务对象实例验证服务。您可调用该服务进行 “基于接口限定符” 的隐式验证或者显式编程验证。
简介
IBM 客户要求使用已定义的 XSD(XML 模式定义)约束在运行时中对业务对象(BO)实例进行验证。此验证针对特定的业务系统,以确保数据的一致性和准确性。从 6.1 版开始,WebSphere Process Server 提供了在运行时进行 BO 实例验证的支持。这个功能可以确认传递到操作的数据与 XSD 类型和该操作输入的约束相匹配。有两种方法可用来验证 BO 实例:
- 利用数据验证限定符
- 调用 BOInstanceValidator APIs
本文主要讨论在 WebSphere Process Server 中进行业务对象验证,演示如何创建带约束的业务对象,以及如何在运行时中根据已定义的约束验证业务对象实例。
根据约束定义业务对象
业务对象是应用程序数据(如客户或者发票)的容器。业务对象的底层结构是一个 XML 模式定义(XSD)。您可以通过直接在 WebSphere Integration Developer 中创建一个业务对象或者导入一个现有的 XSD 文件,从而对业务对象进行定义。您可以为它的元素添加约束,从而在运行时环境中进一步验证。
如要创建带约束的业务对象,您可以下载一个 示例模块 。
- 选择 File > Import,遵循 Import Wizard,然后选择 Project Interchange(图 1),把示例模块导入您的工作区,以继续后面的操作。
图 1. Import Wizard
- 在示例模块中,您能够找到三个业务对象:User、Order 和 Item。如图 2 所示。
图 2. 示例中的 Business Objects
- 为业务对象(User,Order 和 Item)元素添加约束。您可以给 XSD 内置的原语类型添加约束,以进行特定的验证检查。要查看显示数据类型和约束支持的表的链接,请参见
Quality of service qualifier reference。我们将通过 String 类型和它支持的约束(如 Length、minLength、maxLength、Pattern、Enumeration 等等)来说明这个部分。
- 限制在 String 类型中的元素的长度。定义 User 的 ID 元素的长度限制:
- 在业务对象编辑器中打开 User,然后通过单击选择 ID 字段。
- 在 Properties 视图中,把 Minimum length 和 Maximum length 分别设为 8 和 16,如图 3 所示。
- 为 Order 和 Item 的 ID 元素添加和上面相同的约束,用以限制长度。
图 3. 定义长度约束
- 在 String 类型中,为元素添加 Enumeration 约束。假设订单状态仅限于特定的一些枚举值。要定义这个约束,执行下面的操作:
- 在业务对象编辑器中打开 Order,然后选择 status 字段。
- 在 Properties 视图中,选择复选框 Only permit certain values。
- 选择 Enumerations,然后添加枚举值,如图 4 所示。
图 4. 定义 Enumeration 约束
- 在 String 类型中,为元素添加 Pattern 约束:
- 假设用户密码遵循一个规则 “由字母和数字等混合字符组成,最短 6 个字符,最长 16 个字符”。
- 您可以使用正则表达式描述这个规则。为了便于正则表达式的编写和测试,在业务对象编辑器中,提供了一个 RegularExpression Wizard
- 要定义这个约束,在业务对象编辑器中打开 User,然后选择 password 字段。
- 在 Properties 视图,选择 Only permit certain values。
- 单击 Patterns,将会打开 Regular Expression Wizard。要为密码规则创建正则表达式,对 Token contents 选择 Alphanumeric character ( \w )。然后,在 Occurrence 的 Range 中输入类型 6 到 16,如图 5 所示,然后单击 Add。
图 5. 在 Regular Expression Wizard 中编写正则表达式
- 单击 Next。您可以加入示例文本,测试正则表达式(图 6)。显示匹配结果后,单击 Finish。
图 6. 在 Regular Expression Wizard 中测试正则表达式
- 在 Patterns(图 7)中添加了一个正则表达式。
图 7. 定义 Pattern 限制

 |

|
验证业务对象实例
有两种方法可用来在运行时中验证业务对象实例,如上述 XSD 约束所定义:
- 使用数据验证限定符
- 使用 BOinstanceValidator APIs
使用数据验证限定符
您可以使用一个数据验证限定符验证来自业务对象的实例数据。构成限定符的运行时验证器将检查业务对象正在传递的 XSD 类型是否是客户所期望的类型。为 WSDL 界面添加限定符时,传递进来的数据对象将得到验证。
- 在 WSDL 界面添加数据验证限定符。您可以把限定符设为三个级别:
- 组件的所有界面
- 单个界面
- 一个界面的单个操作。在本文中将把它应用在最后一个级别。
- 打开示例模块的组装图表,然后选择 SaveUserInfo 组件。
- 在 Properties 视图中,选择 Interfaces > SaveUser(界面)> saveUserInfo(操作)。
- 单击 Qualifiers 标签,然后添加 Data 验证限定符,如图 8 所示。
图 8. 添加数据验证限定符
- 定义限定符设置:Log error and continue (default) 和 Throw exception。如果在 BO 实例验证中出现了异常情况,限定符设置将定义动作。数据验证限定符有两种设置:
-
Log error and continue (default):如果在验证的过程中出现异常情况,相关的错误将被记录到日志中,继续执行所请求操作。由于无法保证服务能够处理无效数据,因此,导致了一个运行时错误。
-
Throw exception:如果在验证过程中出现异常情况,将会抛出一个异常,所请求操作也将停止执行。
图 9. 定义限定符设置
- 测试限定符:
- 启动服务器,并且在其上部署示例应用程序(图 10)。
图 10. 部署应用程序
- 打开示例模块的组装图表,右键单击 SaveUserInfo 组件,然后选择 Test Component。
- 为 User 输入数据,如图 11 所示。然后,单击绿色箭头。
图 11. 输入数据 1
由于 User 中的密码元素的模式约束被违背,而且 Throw exception 被选为针对错误执行的动作,因此将抛出一个异常。检查服务器日志,您会发现所请求的操作 saveUserInfo() 已经停止了执行(图 12)。
图 12. 验证结果 1
- 为 User 输入数据,包括它的子 BO:Order 和 Item(图 13),然后单击绿色箭头。
图 13. 输入数据 2
数据验证限定符对 BO 实例进行深度验证。如果一个 BO 有子 BO,整个 BO 树都将得到验证。因此,当 User 的实例传递进来后,Order 和 Item 的内部 BO 实例也会得到检查。然后,抛出一个异常,指出 user/orders[0]/items[0]/ID 长度约束被违背(图 14)。
图 14. 验证结果 2
使用 BOInstanceValidator APIs
在 WebSphere Process Server 中,BO Instance Validator 服务支持数据验证限定符。这个服务也提供 BOInstanceValidator APIs,用来验证 BO 实例。
- 帮助客户机确定 BO Instance Validator 服务的位置:
BOInstanceValidator boValidator=(BOInstanceValidator)ServiceManager.INSTANCE.
locateService("com/ibm/websphere/bo/BOInstanceValidator");
|
- 帮助客户对 BO 实例进行具有深度的验证。下面的代码同时验证了一个 User 实例以及 Order 和 Item 的内部实例。
ArrayList diagnostics = new ArrayList();
boolean result = boValidator.validate(user, diagnostics);
System.out.println("The result of validate() is: " + result);
//Print the diagnostics info
if (!result) {
Iterator errorList = diagnostics.iterator();
while(errorList.hasNext()){
DataObject error = (DataObject)errorList.next();
System.out.println("Error property: " + error.get("property"));
System.out.println("Error message: " + error.get("message"));
}
}
|
- 帮助客户机对 BO 实例进行简单的验证。仅仅对 BO 树的第一层进行验证。下面的代码验证一个 User 实例,但是,没有对 Order 和 Item 的内部实例进行验证。
boolean result = boValidator.validateShallow(user, diagnostics);
|
- 帮助客户机对 BO 实例的属性进行详细的或者简单的验证。在下面的代码中,当一个 User 实例传递进来时,由属性路径(第二个参数)指定的 Order 实例将得到验证。
validateProperty 方法对它们进行详细的验证,而 validatePropertyShallow 方法仅仅检查第一层,忽略内部的 Item 实例。
boolean result1= boValidator.validateProperty(user, "orders", diagnostics);
boolean result2= boValidator.validatePropertyShallow(user, "orders", diagnostics);
|

 |

|
结束语
本文描述了 WebSphere Process Server 的业务对象实例验证服务。您可以调用这个服务进行隐式的 “基于接口限定符” 的验证,或者显式编程验证。您学习了如何定义带有约束的业务对象,以及如何验证业务对象实例。
下载 | 描述 | 名字 | 大小 | 下载方法 |
|---|
| 代码样例 | BOValidation_PI.zip | 23 KB | HTTP |
|---|
参考资料 学习
获得产品和技术
-
下载 IBM 产品评估版
,并开始使用来自 DB2、Lotus、Rational、Tivoli 和 WebSphere® 的应用程序开发工具和中间件产品。
作者简介  | 
|  | Zhi Qiu Xie 是位于中国北京的 IBM China Development Lab 的一名软件工程师。他曾在 WebSphere Process Server 系统验证团队工作了两年,目前在 Business Process Management Integration Quality Assurance 团队工作。 |
 | 
|  | Zi Hui Duan 是位于中国北京的 IBM China Development Lab 的一名资深软件工程师。他曾从事 WebSphere Process Server L3 支持,目前效力于 Business Process Management Integration Quality Assurance 团队。 |
对本文的评价
|