XMLBeans帮助业务流程开发
【IT168技术文档】
XMLBean 是一种 XML-Java 绑定工具,是早在Beehive之前,BEA 向 Apache 提交的另一个项目。到 2004 年 6 月为止, XMLBean 就已经作为一个羽翼已丰的 Apache Software Foundation Project 得到人们的接受。
XMLBean通过编译 XML Schema 而创建,把XML实例和底层架构映射为 JavaBean 风格的对象,开发人员可以通过 getter 和 setter 访问器方法轻松定位、检索和操作 XML 实例数据。最近,笔者正在参与国外某大型保险系统的开发,与大家分享使用XMLBeans的心得。这篇文章通过一个简化了的保险实例业务流程,介绍Java数据对象XMLBeans的强大之处。
实例场景:
这是一个关于保险业务的实例,我们将从外部得到一个描述保单信息的XML文件,然后我们调用一个Web Service方法来计算保单的保额、保费,并重新返回这个XML文件。接着,我们会取得一个描述保险产品的费率列表的XML文件。通过数据转换将两这个XML文件转换为系统最终保单XML文件输出。虽然实际的保险业务要复杂很多,但这个实例可以很好地说明XMLBeans在业务流程开发中的作用

现状:
在传统的方法中,我们一般会在系统内部构建Java对象,从外部获得XML文件后,通常我们要用XML分析器来提取相关的部分,把它们转化成Java的表示形式,然后通过系统使用这些Java对象,但实际上Java中许多服务的实现并没有使用XML分析器,而是分析了传入的HTTPInputStream并使用了StringTokenizer或此类方法来提取数据。这样做的直接后果便是在开发中产生了开销。
同时,用这种方法处理XML还非常容易出错。即使确实存在表示XML数据的XML架构,开发者也不一定会得到类型安全(type-safe)数据所带来的好处,因为使用导入导出方法时,只有当XML数据进入或离开系统时才会应用有效性检查。因此,当开发者可能会选择使用XML架构时,XML有效性检查只对该文档有效;对Java对象来说,开发者必须在setter方法中手动创建前置条件(pre-condition)和后置条件(post-condition)来检查数据。
处理XML所带来的开发开销和数据有效性检验的困难一起产生了第三个困难:相信许多开发者都与我有着相同的苦恼,数据的表示随着业务需求变化而不断的变化,修改架构的同时,导致对语法分析代码,XML生成代码和有效性检验代码进行重构,而这些代码可能分散在系统得许多Java对象中。因此,使用导入导出方法处理XML文档,无法跟上业务的变化。
XMLBeans解决方案:
XMLBeans通过把Java和XML作为整体来克服以上这些困难。通过利用XML Schema的功能来提供结构化和约束性数据类型,开发者可以像Java对象那样直接访问XML文档。通过使用XMLBeans,Java开发者不需要花时间来编写导入/导出和有效性检验代码。相反,XML文档被视作极类似于Java-Bean方式访问的最好的数据对象。
新建项目
新建一个流程项目来实现之前的业务流程。打开workshop,点击File->New->Project选择Process->Process Project,在Project name中输入项目名称XMLBeansApp,如图所示:

XMLBeans 的起点是 XML Schema。Schema(包含在 XSD 文件中)是 XML 文档,它定义了其他 XML 文档必须遵守的一组规则。XML Schema 规范提供了丰富的数据模型,使您可以表达复杂的结构,并对数据加以约束。例如,XML Schema 可以对文档中数据的顺序进行控制,或对特定的值加以约束(例如,保单录入日期必须大于 1900)。而在 Java 中,则通常要编写自定义代码才能强制实施此类规则。XMLBean 遵守 Schema 约束。
Weblogic Platform8.1 提供了对于XML的强化支持,主要是通过XMLBean来实现的,当用户通过Workshop,编写了XML的Schema后保存时,Workshop会自动按照Schema,生成XMLBean的子类,通过生成的内置类和方法,可以实现XML的解析和XML元素的生成、修改和访问。
在Schemas文件夹下,新建一个表示保单信息的Schema文件:PolicyInfo.xsd,我们可以在XMLSpy中编辑这个schema,如图所示:

<?xml version="1.0"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:po="http://temp.openuri.org/XMLBeansApp/PolicyInfo"
targetNamespace="http://temp.openuri.org/XMLBeansApp/PolicyInfo"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:element name="policy-info">
<xs:complexType>
<xs:sequence>
<!--保单ID-->
<xs:element name="policyID" type="xs:long"/>
<!--保险产品名称-->
<xs:element name="productName" type="xs:string"/>
<!--保险产品ID-->
<xs:element name="productID" type="xs:long"/>
<!--保单起期-->
<xs:element name="effDate" type="xs:dateTime"/>
<!--保单止期-->
<xs:element name="expDate" type="xs:dateTime"/>
<!--保单保额-->
<xs:element name="sumInsured" type="xs:double"/>
<!--保单保费-->
<xs:element name="premium" type="xs:double"/>
<!--客户-->
<xs:element name="customer" type="po:customer"/>
<!--标的列表,标的至少1个-->
<xs:element name="insured-item" type="po:insured-item" minOccurs="1" maxOccurs="unbounded"/>
![]()
</xs:sequence>
</xs:complexType>
</xs:element>
<!--客户-->
<xs:complexType name="customer">
<xs:sequence>
<!--客户名称-->
<xs:element name="name" type="xs:string"/>
<!--联系电话-->
<xs:element name="phone" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<!--标的-->
<xs:complexType name="insured-item">
<xs:sequence>
<!--标的名称-->
<xs:element name="name" type="xs:string"/>
<!--标的数量-->
<xs:element name="quantity" type="xs:int"/>
<!--单位保费-->
<xs:element name="sumInsured" type="xs:double"/>
<!--单位保额-->
<xs:element name="premium" type="xs:double"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
0
相关文章