Wsdl2java生成FIle的问题

时间:2013-11-07 12:05:21

标签: cxf wsdl2java

我身上发生了一些奇怪的大脑。 在给定的xsd文件中,我们找到一个xml元素,如下所示:

<xsd:element name="getAllOperationsSystemsRequest">
    <xsd:annotation>
      <xsd:documentation>
      </xsd:documentation>
    </xsd:annotation>
</xsd:element>

并且wsdl操作链接到元素

   <wsdl:operation name="getAllOperationsSystems">
     <wsdl:input message="tns:getAllOperationsSystemsRequest"/>
     <wsdl:output message="tns:getAllOperationsSystemsResponse"/>
     <wsdl:fault name="getAllOperationsSystemsException" message="tns:getAllOperationsSystemsException"/>
  </wsdl:operation> 

显然,getAllOperationsSystemsRequest未绑定到任何已知类型(缺少属性“type”)。 结果,在我们执行了wsdl2java工具之后,我们最终获得了一个方法定义:

public org.tmforum.mtop.mri.xsd.osr.v1.MultipleObjectsResponseType getAllOperationsSystems(
    javax.xml.ws.Holder<org.tmforum.mtop.fmw.xsd.hdr.v1.Header> mtopHeader,
    java.lang.**Object** mtopBody
  )throws GetAllOperationsSystemsException

生成一个Object而不是OperationsSystemsRequest作为输入参数类型,(实际上OperationsSystemsRequest永远不会存在。

最后,我们在marshall / unmarshall中得到一个粗体运行时错误

引起:com.sun.istack.SAXException2:“javax.xml.bind.JAXBElement”的实例代替“java.lang.Object”,但“javax.xml.bind.JAXBElement”被绑定匿名类型。

我非常感谢任何人提供解决方案的信息。 Tnanks提前。

1 个答案:

答案 0 :(得分:0)

根据XML Schema规范,getAllOperationsSystemsRequest元素的“type”是xsd:anyType。基本上,任何事情。这就是代码中生成Object的原因。代码生成器为类型生成,而不是元素(主要是)。如果类型仅在元素中表示,那么它将获得@XmlRootElement注释,但在大多数情况下,您必须考虑类型。

我建议将架构更改为:

<xsd:element name="getAllOperationsSystemsRequest">
    <xsd:annotation>
      <xsd:documentation>
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexType>
        <xsd:sequence/>
    </xsd:complexType>
</xsd:element>

这应该生成一个类型并将元素限制为一个空元素。