CXF wsdl2java приводит к BINDING_MISSING_TYPE - PullRequest
2 голосов
/ 27 июня 2011

Использование java 6, CXF 2.3.1 и Maven 2.

При запуске инструмента CXF wsdl2java через плагин Maven я сталкиваюсь со следующей проблемой:

wsdl2java -dC: \ devel \ adpoint_callback \ target \ generate-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 atg или.apache.cxf.tools.wsdlto.WSDLToJavaContainer.execute (WSDLToJavaContainer.java:279)

... ~ 20 строк

Вызывается: org.apache.cxf.wsdl11.WSDMSDINGв org.apache.cxf.wsdl11.WSDLServiceBuilder.buildServices (WSDLServiceBuilder.java:306) в org.apache.cxf.wsdl11.WSDLServiceBuilder.buildServices (WSDLServiceBuilder.buildServicesминимальный файл WSDL, адаптированный с 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>

Использование службы / привязки точно такое же, как в примере в документе спецификации WSDL 1.1 http://www.w3.org/TR/wsdl

Генерация кода не будет работать без -флажок validate либо - предупреждения о проверке просто не отображаются.

Вопрос, конечно, почемуэлемент не принимается в качестве типа привязки для элемента привязки, как и должно быть.


[EDIT: Fix]

Если я задаю для пространства имен по умолчанию значението же значение, что и мой targetNamespace, ошибка исчезает.Каким-то образом CXF может справиться с тем фактом, что я не устанавливаю пространство имен по умолчанию до того момента, когда оно должно было обрабатывать привязку.В этот момент он выдает ложное исключение об отсутствующем типе привязки.

Поэтому исправить это так же просто, как изменить атрибуты тега wsdl: Definition для определения пространства имен по умолчанию:

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

1 Ответ

0 голосов
/ 22 марта 2015

Когда вы используете targetNamespace="http://example.com/mynamespace" и определяете свою привязку следующим образом:

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