web前端

位置:IT落伍者 >> web前端 >> 浏览文章

WebLogic Workshop 8.1中处理不带命名空间模式


发布日期:2019年11月12日
 
WebLogic Workshop 8.1中处理不带命名空间模式

摘要

将遗留应用程序或集成系统与BEA WebLogic Workshop集成在一起时经常要用到XML和模式然而某些遗留系统在最初设计时并没有包括处理XML命名空间的功能相反这些遗留系统只接受不带目标命名空间的无格式XML消息而这可能导致在WebLogic Workshop中出现沖突事实上可以在多个模式中定义名称相同的全局类型或元素

本文描述了如何通过WebLogic Workshop和XMLBeans简单而有效地解决这个问题本文假定您对XML模式和XMLBeans有一些基本了解您可以下载本文中使用的示例

简介

XMLBeans提供了一种处理XML的方法即操作代表XML的Java类这些类是使用XML适合的模式来创建的可以使用XMLBeans来编译一个或多个模式文件从而生成Java类型

集成遗留解决方案时遇到的一个常见问题是要与不同来源的多个模式打交道而这些模式均未带有指定的目标命名空间如果这些模式共享元素名称WebLogic Workshop模式项目就无法成功编译生成的Java类型而且还会出现诸如Duplicate global typeDuplicate global element这样的错误下面举例说明这样一个场景

场景实例

假设您使用WebLogic Workshop创建了一个新的应用程序通常您会创建一个模式项目导入您的模式然后WebLogic Workshop将自动把这个模式编译为XMLBeans

<xs:schema xmlns:po= xmlns:xs= elementFormDefault=qualified> <xs:element name=purchaseorder type=customer/> <xs:complexType name=customer> <xs:sequence> <xs:element name=name type=xs:string/> <xs:element name=address type=xs:string/> </xs:sequence> </xs:complexType></xs:schema>

清单 : Schemaxsd

Schema没有目标命名空间所得到的XML文档中带有元素名称name和address如下所示

<?xml version= encoding=UTF?><purchaseorder xmlns:po= xmlns:xsi=instance > <name>John</name> <address> North First St</address></purchaseorder>

清单 : Samplexml

如果您尝试从这个模式生成Java类型它将被正确地编译为一个XMLBean现在可以导入另一个模式

<xs:schema xmlns:xs= xmlns:foo= elementFormDefault=qualified> <xs:element name=clientrecord type=customer/> <xs:complexType name=customer> <xs:sequence> <xs:element name=name type=xs:string/> <xs:element name=address type=xs:string/> <xs:element name=phone type=xs:string/> </xs:sequence> </xs:complexType> <xs:element name=purchaseorder type=customer/></xs:schema>

清单 : Schemaxsd

Schema 同样没有目标命名空间下面的XML文档就是这个模式的一个实例它带有元素名称name address和 phone

<?xml version= encoding=UTF?><clientrecord xmlns:foo= xmlns:xsi=instance> <name>Susan</name> <address> South Second St</address> <phone></phone></clientrecord>

清单 : Samplexml

在WebLogic Workshop中当把这两个模式文件导入到一个模式项目中并生成XMLBeans类时WebLogic Workshop将显示编译错误

ERROR: error: Duplicate global type: customerERROR: error: Duplicate global element: purchaseorder

可以看到编译器提示说全局类型customer和全局元素purchaseorder被多次定义如果看看我们的模式就会发现这并不值得惊奇当模式不带目标命名空间时这类沖突就很可能会出现下面将给出解决这个问题的办法

解决方案

有很多可行的解决方案都可以解决这个问题我将挑出其中三种进行讨论

解决方案添加目标命名空间

为模式添加不同的目标命名空间就可以解决这个问题——我们也推荐使用这种方法但是在大部分时间里您都无法控制模式所以我们需要另寻出路

解决方案创建单独的模式项目

解决该问题的另一种方法是在WebLogic Workshop中创建两个模式项目在这个例子中假设您在应用程序中创建了另一个Schema项目并分别在模式项目和模式项目中编译schemaxsd和schemaxsd如图所示

在这种情况下可以成功编译模式两个项目都不会抱怨定义重复然而看看图中生成的类便知Libraries文件夹包含两个jar文件SchemaPjar和SchemaPjar这两个文件是WebLogic Workshop编译的结果两个jars文件中均定义了noNamespaceCustomer和noNamespacePurchaseOrderDocument类如下图所示

: 一个包含两个模式项目的WebLogic Workshop应用程序

应用程序中创建了名称相同的Java类(XMLBeans)结果您无法选择要在应用程序中使用的那一个在这种情况下还是存在前面出现过的沖突问题但是这次遇到麻烦的是应用程序类加载器

您还会注意到Java包名称noNamespace并非开发人员友好的应该根据您的编码习惯对其进行修改这也为实际的解决方案指明了方向——只要修改包名称便可避免沖突第三种解决方案中可以解决这些问题

解决方案使用XMLBeans配置文件

在DevDev站点上您可以读一篇有关XMLBeans编译器选项的优秀文章即Hetal Shah编写的配置 XMLBeans(中文)(DevDev月)这篇文章中提到运行XMLBeans编译器时您可以指定一个可选的配置文件用于修改XMLBeans生成器的行为这样就可以解决名称沖突和包名称不友好的问题

您可以在模式project中创建一个compilerxsdconfig文件如图所示您将看到一个错误

ERROR: compilerxsdconfig:: Document D:\SP\user_projects\domains\DevDev\SchemaP\compilerxsdconfig is not an xsd config file

您可以忽略上面的错误不会出现问题因为所创建的文件目前是空的和无效的您可以使用这个配置文件指定Java包的名称从而为定义中缺少目标命名空间的XML元素和类型生成XMLBeans此处的技巧在于使用保留字##local如下所示

<xb:config xmlns:xb=> <xb:namespace uri=##local> <xb:package>comfoo>/xb:package> </xb:namespace></xb:config>

清单 : compilerxsdconfig

现在如果打开Libraries文件夹您将会看到模式Projectjar包含Java包comfoo中的类而不是图中noNamespace中的类显然您应该使用有效的Java包名称否则将产生错误

: WebLogic Workshop项目中xsdconfigxml和结果jars文件的位置

现在通过创建一个类似的compilerxsdconfig文件您可以对Project执行同样的步骤

结束语

遗留XML应用程序有时会省略命名空间而这可能会导致集成问题本文说明了如何使用XMLBeans配置文件编译模式从而减轻这个问题带来的困扰通过这个XMLBeans配置文件您可以控制如何为生成的类型选择名称设计该配置文件的目的是把模式类型名称映射为生成的Java类型名称当一些模式拥有相同的命名空间时同样的方法可以防止类似问题的出现

上一篇:Web应用中避免Form重复提交的三种方案

下一篇:为你的DHTML添活力