是否可以使用Axis2 / XmlBeans管理重复的元素名称

时间:2012-10-18 18:14:09

标签: soap axis2 xmlbeans

我们使用的是使用axis2生成java文件的第三方wsdl文件。现在我们遇到一个问题,即不同文件中存在重复元素,但具有相同的命名空间。

示例:

file1.wsdl => <xsd:element name="MyElementName"> 
file2.wsdl => <xsd:element name="MyElementName"> 

因此,结果是从不同的wsdl文件生成了两次相同的文件,因此在文件生成之后只生成了最后生成的文件。

我想知道这是否真的是正确的,还是wsdl文件的设计缺陷? 如果没有,我如何使用axis2来解决这个问题?

修改

好的,所以我发现了一个标志,我可以为这些类使用不同的包,所以现在我有

com.package.MyElementName
com.package.ext.MyElementName

然而,它仍然不起作用,因为轴(或xmlbeans)给了我错误的类。

看看这个例子。我认为这会起作用,但我得到一个ClassCastException

java.lang.ClassCastException:com.package.MyElementName.impl.MyElementNameDocumentImpl无法强制转换为com.package.ext.MyElementNameDocument

com.mypackage.ext.MyElementNameDocument doc1 =
   com.mypackage.ext.MyElementNameDocument.Factory.newInstance();
doc1.addNewMyElementName();

com.mypackage.ext.MyElementNameDocument doc2 = 
  com.mypackage.ext.MyElementNameDocument.Factory.parse(doc1.toString());

编辑 -

好的,我在网上找到了真实的例子,所以我不妨展示真实的例子。

http://dtd.cobaltgroup.com/STAR/5.2.4/WSDL/Templates/

在其他许多人中有这两个

http://dtd.cobaltgroup.com/STAR/5.2.4/WSDL/Templates/GetServiceProcessingAdvisory.wsdl http://dtd.cobaltgroup.com/STAR/5.2.4/WSDL/Templates/GetStandardCodes.wsdl

如您所见,它们都具有ProcessMessage元素。希望这能澄清一些事情。

 </xsd:complexType>
     <!--Global Elements used by the Bindings--><xsd:element name="ProcessMessage">
        <xsd:annotation>
           <xsd:documentation source="http://www.starstandard.org">
                Process Message Input
            </xsd:documentation>
        </xsd:annotation>
        <xsd:complexType>
           <xsd:sequence>
              <xsd:element name="payload"
 type="starws:GetServiceProcessingAdvisoryPayload" minOccurs="0"
                           maxOccurs="1"
                           form="qualified"/>
           </xsd:sequence>
        </xsd:complexType>
     </xsd:element>


 <!--Global Elements used by the Bindings--><xsd:element name="ProcessMessage">
        <xsd:annotation>
           <xsd:documentation source="http://www.starstandard.org">
                Process Message Input
            </xsd:documentation>
        </xsd:annotation>
        <xsd:complexType>
           <xsd:sequence>
              <xsd:element name="payload" type="starws:GetStandardCodesPayload" 
  minOccurs="0"
                           maxOccurs="1"
                           form="qualified"/>
           </xsd:sequence>
        </xsd:complexType>
     </xsd:element>

...

问候/约翰

1 个答案:

答案 0 :(得分:2)

供应商至少非常糟糕的wsdl设计(特别是对于其公司名称中包含“标准”一词的那个):全局类型/元素定义应该制作一次,即放入单独的全局XSD-文件(就像他们在这里做的那样:

 <xsd:include schemaLocation="STARWSDLDataTypes.xsd"/>

)。

此外,servicenamespace应保持特定于服务,以便提供有关服务版本控制的灵活性。

我担心这个实际的星座(相同名称空间+ wsdls中的重复元素声明)是一个灰色区域主题 - 我没有在网上找到任何关于此的明确声明,所以你唯一的解决方案可能是针对两个wsdl文件进行开发完全分开了。含义axis2-wise 2个应用程序(每个wsdl 1个)而不是一个共享应用程序。