[转帖]   在WebLogic Workshop中处理不带命名空间的schema_Tomcat, WebLogic及J2EE讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Tomcat, WebLogic及J2EE讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2399 | 回复: 0   主题: [转帖]   在WebLogic Workshop中处理不带命名空间的schema        下一篇 
    本主题由 koei 于 2014-5-2 16:07:39 移动
funny
注册用户
等级:中校
经验:1529
发帖:111
精华:4
注册:2013-3-13
状态:离线
发送短消息息给funny 加好友    发送短消息息给funny 发消息
发表于: IP:您无权察看 2013-3-15 15:50:10 | [全部帖] [楼主帖] 楼主

文章转载自:http://bbs.middleware123.com/forum.php?mod=viewthread&tid=5227&extra=page%3D1%26filter%3Dtypeid%26typeid%3D27%26typeid%3D27

摘要

将遗留应用程序或集成系统与BEA WebLogic

Workshop集成在一起时,经常要用到XML和模式。然而,某些遗留系统在最初设计时并没有包括处理XML命名空间的功能。相反,这些遗留系统只接受

不带目标命名空间的无格式XML消息,而这可能导致在WebLogic 

Workshop中出现冲突。事实上,可以在多个模式中定义名称相同的全局类型或元素。

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

简介

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

集成遗留解决方案时遇到的一个常见问题是,要与不同来源的多个模式打交道,而这些模式均未带有指定的目标命名空间。如果这些模式共享元素名

称,WebLogic Workshop模式项目就无法成功编译生成的Java类型,而且还会出现诸如“Duplicate global 

type”或“Duplicate global element”这样的错误。下面举例说明这样一个场景。

场景实例

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

<xs:schema xmlns:po=http://openuri.org/easypo
xmlns:xs=http://www.w3.org/2001/XMLSchema
elementFormDefault=qualified> <xs:element name=purchase-order
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>


清单 1: Schema1.xsd

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

<?xml version=1.0 encoding=UTF-8?><purchase-order
xmlns:po=http://openuri.org/easypo
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance >
<name>John</name> <address>123 North First
St</address></purchase-order>


清单 2: Sample1.xml

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

<xs:schema xmlns:xs=http://www.w3.org/2001/XMLSchema
xmlns:foo=http://openuri.org/clientdb
elementFormDefault=qualified> <xs:element name=client-record
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=purchase-order
type=customer/></xs:schema>


清单 3: Schema2.xsd

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

<?xml version=1.0 encoding=UTF-8?><client-record
xmlns:foo=http://openuri.org/clientdb
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance>
<name>Susan</name> <address>6789 South Second
St</address>
<phone>408-123-4567</phone></client-record>


清单 4: Sample2.xml

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

ERROR: error: Duplicate global type: customer ERROR: error: Duplicate global element: purchase-order


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

解决方案

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

解决方案

1:添加目标命名空间

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

解决方案

2:创建单独的模式项目

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

在这种情况下,可以成功编译模式。两个项目都不会抱怨定义重复。然而,看看图1中生成的类便知,Libraries文件夹包含两个jar文

件,SchemaP1.jar和SchemaP2.jar,这两个文件是WebLogic 

Workshop编译的结果。两个jars文件中均定义了noNamespace.Customer和

noNamespace.PurchaseOrderDocument类,如下图所示:

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

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

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

解决方案

3:使用XMLBeans配置文件

在Dev2Dev站点上,您可以读一篇有关XMLBeans编译器选项的优秀文章,即Hetal Shah编写的配置 

XMLBeans(中文)(Dev2Dev,2004年11月)。这篇文章中提到,运行XMLBeans编译器时,您可以指定一个可选的配置文件,用于修

改XMLBeans生成器的行为。这样就可以解决名称冲突和包名称不友好的问题。

您可以在模式“project1”中创建一个compiler1.xsdconfig文件,如图2所示。您将看到一个错误:

ERROR: compiler1.xsdconfig:0: Document
D:\SP5\user_projects\domains\Dev2Dev\SchemaP1\compiler1.xsdconfig is not
an xsd config file


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

<xb:config xmlns:xb=http://www.bea.com/2002/09/xbean/config>
<xb:namespace uri=##local>
<xb:package>com.foo>/xb:package> </xb:namespace>
</xb:config>


清单 5: compiler1.xsdconfig

现在,如果打开Libraries文件夹,您将会看到模式“Project1”jar包含Java包com.foo中的类,而不是图1中noNamespace中的类。显然,您应该使用有效的Java包名称,否则将产生错误。

图 2: WebLogic Workshop项目中xsdconfig.xml和结果jars文件的位置

现在,通过创建一个类似的compiler2.xsdconfig文件,您可以对Project2执行同样的步骤。

结束语

遗留XML应用程序有时会省略命名空间,而这可能会导致集成问题。本文说明了如何使用XMLBeans配置文件编译模式,从而减轻这个问题带来的困

扰。通过这个XMLBeans配置文件,您可以控制如何为生成的类型选择名称。设计该配置文件的目的是把模式类型名称映射为生成的Java类型名称。当一

些模式拥有相同的命名空间时,同样的方法可以防止类似问题的出现。

该贴由koei转至本版2014-5-2 16:07:39




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论