技术开发 频道

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在业务流程开发中的作用

  上图是在Weblogic Integration中定义的业务流程,Client Request表示一个客户端的请求。请求包含两个XML文件,一个描述了保单的基本信息,另一个则描述了保险产品的费率列表。calculatePremium是一个Web Service方法,流程通过调用这个方法累加保单标的(标的是指被保险的对象,一个保单由1个或多个标的组成)上的保额保费,从而计算出整个保单的保额保费。constructPolicy是一个数据转换方法,利用WebLogic Workshop 的 mapper 功能实现将保单信息与保险产品费率表两个XML文档进行数据转换,最终得到一个符合系统需求的保单XML文件。

  现状:

  在传统的方法中,我们一般会在系统内部构建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,如图所示:

  创建Schema

  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文件。
<?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
相关文章