I need to use document/literal/bare SOAP binding I'm little bit surprised
about difference of passing array parameters when using this SOAP binding in
oposite to document/literal/wrapped style.
I have following simple interface:
@WebService
@SOAPBinding(style=Style.DOCUMENT, use=Use.LITERAL, parameterStyle =
ParameterStyle.BARE)
public interface ITestWebService {
public void testPassingArray(@WebParam(name = "arrayOfLongs") Long[]
arrayOfLongs);
}
Auto-generated WSDL (by CXF version 2.1.2) looks like following:
<?xml version="1.0" ?><wsdl:definitions name="TestBareWebServiceImplService"
targetNamespace="http://testbare.webservice.com/"
xmlns:ns1="http://cxf.apache.org/bindings/xformat"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://testbare.webservice.com/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<wsdl:types>
<xs:schema attributeFormDefault="unqualified"
elementFormDefault="unqualified"
targetNamespace="http://jaxb.dev.java.net/array"
xmlns="http://jaxb.dev.java.net/array"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType final="#all" name="longArray">
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="item"
nillable="true" type="xs:long"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
<xsd:schema attributeFormDefault="unqualified"
elementFormDefault="qualified"
targetNamespace="http://testbare.webservice.com/"
xmlns:ns0="http://jaxb.dev.java.net/array"
xmlns:tns="http://testbare.webservice.com/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:import namespace="http://jaxb.dev.java.net/array"></xsd:import>
<xsd:element name="arrayOfLongs" nillable="true"
type="ns0:longArray"></xsd:element>
</xsd:schema>
</wsdl:types>
<wsdl:message name="testPassingArray">
<wsdl:part element="tns:arrayOfLongs" name="arrayOfLongs">
</wsdl:part>
</wsdl:message>
<wsdl:message name="testPassingArrayResponse">
</wsdl:message>
<wsdl:portType name="ITestWebService">
<wsdl:operation name="testPassingArray">
<wsdl:input message="tns:testPassingArray" name="testPassingArray">
</wsdl:input>
<wsdl:output message="tns:testPassingArrayResponse"
name="testPassingArrayResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="TestBareWebServiceImplServiceSoapBinding"
type="tns:ITestWebService">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"></soap:binding>
<wsdl:operation name="testPassingArray">
<soap:operation soapAction="" style="document"></soap:operation>
<wsdl:input name="testPassingArray">
<soap:body use="literal"></soap:body>
</wsdl:input>
<wsdl:output name="testPassingArrayResponse">
<soap:body use="literal"></soap:body>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="TestBareWebServiceImplService">
<wsdl:port binding="tns:TestBareWebServiceImplServiceSoapBinding"
name="TestBareWebServiceImplPort">
<soap:address
location="http://localhost:8080/ProwebWebServices/services/TestBareWebService"></soap:address>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
When I generate Java client stubs from this WSDL generated interface looks
like following:
@WebService(targetNamespace = "http://testbare.webservice.com/", name =
"ITestWebService")
@XmlSeeAlso({ObjectFactory.class})
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
public interface ITestWebService {
@WebMethod
public void testPassingArray(
@WebParam(partName = "arrayOfLongs", name = "arrayOfLongs",
targetNamespace = "http://testbare.webservice.com/")
LongArray arrayOfLongs
);
}
I'm surprised that array parameter is "wrapped" in generated class LongArray
through which I need to access internal list of items. I have expected that
generated method on the client side is something like following:
@WebMethod
public void testPassingArray(
@WebParam(partName = "arrayOfLongs", name = "arrayOfLongs",
targetNamespace = "http://testbare.webservice.com/")
java.util.List<java.lang.Long> arrayOfLongs
);
When I'm using document/literal/wrapped SOAP binding then generated client
stub interface is "more friendly and logical":
@WebService(targetNamespace = "http://testbare.webservice.com/", name =
"ITestWebService")
@XmlSeeAlso({ObjectFactory.class})
public interface ITestWebService {
@RequestWrapper(localName = "testPassingArray", targetNamespace =
"http://testbare.webservice.com/", className =
"com.webservices.test.TestPassingArray")
@ResponseWrapper(localName = "testPassingArrayResponse", targetNamespace
= "http://testbare.webservice.com/", className =
"com.webservices.test.TestPassingArrayResponse")
@WebMethod
public void testPassingArray(
@WebParam(name = "arrayOfLongs", targetNamespace = "")
java.util.List<java.lang.Long> arrayOfLongs
);
}
Is this expected behavior when using document/literal/bare SOAP binding?
Originally I thought that when I switch from wrapped to bare client will
compile without any changes. But it seems that client stubs are different
and I need to adapt my client to the little bit different generated
interfaces.
Can someone explain me if described behovior is correct or is it a bug?
Shouldn't be generated interfaces on the client side still the same
independent of which SOAP binding is currently used?
--
View this message in context:
http://www.nabble.com/Passing-array-parameters-when-using-document-literal-bare-SOAP-binding-tp19896773p19896773.html
Sent from the cxf-user mailing list archive at Nabble.com.