When I send a request to my webservice (build with apache camel and running on apache karaf) I always get
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soap:Fault>
<faultcode>soap:Client</faultcode>
<faultstring>Message part {http://localhost:8181/cxf/webservices/inputoutput}input was not recognized. (Does it exist in service WSDL?)</faultstring>
</soap:Fault>
</soap:Body>
</soap:Envelope>
My wsdl looks like this
<?xml version="1.0" encoding="ISO-8859-1"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://localhost:8181/cxf/webservices/inputoutput"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
targetNamespace="http://localhost:8181/cxf/webservices/inputoutput">
<!-- Type definitions for input- and output parameters for webservice -->
<wsdl:types>
<xs:schema targetNamespace="http://localhost:8181/cxf/webservices/inputoutput">
<xs:element name="input">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="surname"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="output">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="forename"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</wsdl:types>
<!-- Message definitions for input and output -->
<wsdl:message name="input">
<wsdl:part name="surname" element="tns:input"/>
</wsdl:message>
<wsdl:message name="output">
<wsdl:part name="forename" element="tns:output"/>
</wsdl:message>
<!-- Port (interface) definitions -->
<wsdl:portType name="InputOutputEndpoint">
<wsdl:operation name="InputOutput">
<wsdl:input message="tns:input"/>
<wsdl:output message="tns:output"/>
</wsdl:operation>
</wsdl:portType>
<!-- Port bindings to transports and encoding - HTTP, document literal encoding is used -->
<wsdl:binding name="InputOutputBinding" type="tns:InputOutputEndpoint">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="InputOutput">
<soap:operation soapAction="http://localhost:8181/cxf/webservices/inputoutput" style="document"/>
<wsdl:input>
<soap:body parts="in" use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body parts="out" use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<!-- Service definition -->
<wsdl:service name="InputOutputEndpointService">
<wsdl:port name="InputOutputEndpoint" binding="tns:InputOutputBinding">
<soap:address location="http://localhost:8181/cxf/webservices/inputoutput"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
And this is my request in SoapUI
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rep="http://localhost:8181/cxf/webservices/inputoutput">
<soapenv:Header/>
<soapenv:Body>
<rep:input>
<surname>test</surname>
</rep:input>
</soapenv:Body>
</soapenv:Envelope>
I can't find anything wrong in my wsdl here. Anyone got an idea what leads to this?
I think the problem is that the target namespace in the wsdl and the one in the schema are the same:
<?xml version="1.0" encoding="ISO-8859-1"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://localhost:8181/cxf/webservices/inputoutput"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
targetNamespace="http://localhost:8181/cxf/webservices/inputoutput">
<!-- Type definitions for input- and output parameters for webservice -->
<wsdl:types>
<xs:schema targetNamespace="http://localhost:8181/cxf/webservices/inputoutput">
...
And then in the message part when you use the 'tns' prefix in tns:input
it cannot resolve the element:
<wsdl:message name="input">
<wsdl:part name="surname" element="tns:input"/>
</wsdl:message>
You can try defining a different target namespace in the schema declaration and adding a new prefix in <wsdl:definitions>
to that namespace.
<?xml version="1.0" encoding="ISO-8859-1"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://localhost:8181/cxf/webservices/inputoutput"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
targetNamespace="http://localhost:8181/cxf/webservices/inputoutput"
xmlns:types="http://localhost:8181/cxf/webservices/inputoutput/types">
<!-- Type definitions for input- and output parameters for webservice -->
<wsdl:types>
<xs:schema targetNamespace="http://localhost:8181/cxf/webservices/inputoutput/types">
...
And then in the message part use this new prefix:
<wsdl:message name="input">
<wsdl:part name="surname" element="types:input"/>
</wsdl:message>
Right now I don't remember if it's mandatory to define different targetnamespaces for the wsdl and the schema in the types element, but I do remember facing a similar issue, and it's also considered a best practice to do so.
I usually create at least two schemas, one for the 'in' and another for the 'out' parameters both having their own namespace to avoid possible name collisions.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With