2011-06-27 73 views
2

使用Java 6中,CXF 2.3.1和Maven 2CXF的WSDL2Java導致BINDING_MISSING_TYPE

當通過Maven插件運行CXF WSDL2Java工具,我遇到 了以下問題:

的WSDL2Java - d c:\ devel \ adpoint_callback \ target \ generated-sources \ cxf -impl -validate -verbose file:/ C:/devel/adpoint_callback/src/main/resources/wsdl/foobar.wsdl wsdl2java - Apache CXF 2.3。 1

WSIBP Validator found <結合>不是 SOAP綁定[DEBUG]

org.apache.cxf.tools.common.ToolException: org.apache.cxf.wsdl11.WSDLRuntimeException: BINDING_MISSING_TYPE 在org.apache.cxf.tools .wsdlto.WSDLToJavaContainer.execute(WSDLToJavaContainer.java:279)

...〜20行

所致:org.apache.cxf.wsdl11.WSDLRuntimeException:在org.apache.cxf.wsdl11 BINDING_MISSING_TYPE .WSDLServiceBuilder.buildServices(WSDLServiceBuilder.java:306) 在org.apache.cxf.wsdl11.WSDLServiceBuilder.buildServices(WSDLServiceBuilder.java:181)

使用適於從http://www.w3schools.com/WSDL/wsdl_binding.asp以下最低WSDL文件:

<?xml version="1.0" encoding="UTF-8"?> 
<wsdl:definitions name="notification" 
    targetNamespace="http://example.com/mynamespace" 
     xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
     xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:xsd="http://example.com/mynamespace/xsd" > 

    <wsdl:types> 
     <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:xsd="http://example.com/mynamespace/xsd" 
      targetNamespace="http://example.com/mynamespace/xsd" > 
      <xs:element name="RequestType" type="xsd:content"/> 
      <xs:element name="ResponseType" type="xsd:content"/> 

      <xs:complexType name="content"> 
        <xs:sequence> 
         <xs:element name="text" type="xs:string"/> 
        </xs:sequence> 
      </xs:complexType> 
     </xs:schema> 
    </wsdl:types> 

    <wsdl:message name="getTermRequest"> 
     <wsdl:part name="body" element="xsd:RequestType"/> 
    </wsdl:message> 

    <wsdl:message name="getTermResponse"> 
     <wsdl:part name="body" element="xsd:ResponseType"/> 
    </wsdl:message> 

    <wsdl:portType name="glossaryTerms"> 
     <wsdl:operation name="getTerm"> 
      <wsdl:input message="getTermRequest"/> 
      <wsdl:output message="getTermResponse"/> 
     </wsdl:operation> 
    </wsdl:portType> 

    <wsdl:binding name="binding" type="glossaryTerms"> 
     <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> 
     <wsdl:operation name="getTerm"> 
      <soap:operation soapAction="http://example.com/getTerm" /> 
      <wsdl:input><soap:body use="literal"/></wsdl:input> 
      <wsdl:output><soap:body use="literal"/></wsdl:output> 
     </wsdl:operation> 
    </wsdl:binding> 

    <wsdl:service name="testService" > 
     <wsdl:port name="testPort" binding="binding"> 
      <soap:address location="http://example.com/mynamespace"/> 
     </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

服務/結合使用是完全正如WSDL 1.1規範文檔中的示例http://www.w3.org/TR/wsdl

如果沒有-validate標誌,代碼生成將不起作用 - 驗證警告只是不顯示。

問題是 - 爲什麼< soap:binding >元素沒有被接受爲綁定元素的綁定類型,因爲它應該如此。


[編輯:修正]

如果我設置默認的命名空間爲相同的值作爲我的目標名稱,錯誤消失。 不知怎的,CXF能夠處理這樣一個事實,即我不會設置默認名稱空間,直到它應該處理綁定爲止。在那一點上,它拋出了一個關於缺少綁定類型的誤導性例外。

因此,固定,這是因爲改變了WSDL的屬性一樣容易:當您使用targetNamespace="http://example.com/mynamespace"

<wsdl:definitions name="notification" 
    targetNamespace="http://example.com/mynamespace" 
     xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
     xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:xsd="http://example.com/mynamespace/xsd" 
     xmlns="http://example.com/mynamespace" > 
+0

我也有過類似的問題。但是它與我沒有在_wsdl:definitions_中放置_targetNamespace_的事實相關。修復只是把它放在那裏。 –

回答

0

,並定義綁定這樣的:定義標籤 定義默認命名空間

<wsdl:binding name="binding" type="glossaryTerms"> 
    ... 
</wsdl:binding>  

然後,您必須在wsdl:service部分中使用相應的名稱空間來引用該綁定。具體來說,它應該是:binding="<namespace>:<binding_name>"。這意味着您必須定義與targetNamespace相同的名稱空間。例如,命名空間TNS

<wsdl:definitions name="notification" 
    targetNamespace="http://example.com/mynamespace" 
    ... 
    xmlns:tns="http://example.com/mynamespace"> 

,然後在wsdl:service部分提到它的時候:

<wsdl:service name="testService"> 
    <wsdl:port name="testPort" binding="tns:binding"> 
     <soap:address location="http://example.com/mynamespace"/> 
    </wsdl:port> 
</wsdl:service>