2011-06-27 4 views
2

Utilisation de Java 6, CXF 2.3.1 et Maven 2.CXF wsdl2java entraînant BINDING_MISSING_TYPE

Lors de l'exécution CXF outil wsdl2java via le plugin Maven, je rencontre la question suivante:

wsdl2java - d C: \ devel \ adpoint_callback \ target \ sources-générées \ cxf -impl -validate -verbose fichier:/C: /devel/adpoint_callback/src/main/resources/wsdl/foobar.wsdl wsdl2java - Apache CXF 2.3. 1

Validateur WSIBP trouvé <liant> est pas une liaison 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 lignes

causés par: org.apache.cxf.wsdl11.WSDLRuntimeException: BINDING_MISSING_TYPE à org.apache.cxf.wsdl11 .WSDLServiceBuilder.buildServices (WSDLServiceBuilder.java:306) à org.apache.cxf.wsdl11.WSDLServiceBuilder.buildServices (WSDLServiceBuilder.java:181)

Utilisation du fichier WSDL minimal suivant adapté de http://www.w3schools.com/WSDL/wsdl_binding.asp:

<?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> 

L'utilisation de service/liaison est exactement tel qu'utilisé dans l'exemple du document de spécification WSDL 1.1 http://www.w3.org/TR/wsdl

La génération de code ne fonctionnera pas sans le drapeau -validate - Les avertissements de validation ne s'affichent tout simplement pas. La question est - bien sûr - pourquoi l'élément < soap: binding > n'est pas accepté comme type de liaison pour l'élément de liaison comme il se doit.


[EDIT: Fix]

Si je mets l'espace de noms par défaut à la même valeur que mon targetNamespace, l'erreur disparaît. D'une manière ou d'une autre, le CXF est capable de gérer le fait que je ne mets pas l'espace de noms par défaut jusqu'au moment où il était censé gérer la liaison. À ce stade, il jette une exception trompeuse sur le type de liaison manquante.

Par conséquent, la fixation de c'est aussi facile que de changer les attributs du fichier WSDL: balise de définition pour définir l'espace de noms par défaut:

<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

J'ai aussi eu un problème similaire. Mais il était assosié au fait que je n'avais pas mis _targetNamespace_ dans le fichier _wsdl: definitions_. La solution était juste de le mettre là. –

Répondre

0

Lorsque vous utilisez le targetNamespace="http://example.com/mynamespace" et définir votre fixation comme ça:

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

Ensuite, vous devez faire référence à cette liaison dans la section wsdl:service avec l'espace de noms correspondant. Plus précisément, il devrait être: binding="<namespace>:<binding_name>".Cela signifie que vous devez définir l'espace de noms identique à targetNamespace. Par exemple, l'espace de noms tns:

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

Et puis, en se référant à elle dans la section wsdl:service:

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