0

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

例子:

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>

……

问候/约翰

4

1 回答 1

2

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

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

)。

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

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

于 2012-10-22T13:15:51.523 回答