Hi guys,
I've found a feature or bug during java ->wsdl -> java process. If one of
parameters is marked as @WebParam(header = true) it will be last parameter
in generated SEI on a client side.
There is an example of it. (apache cxf 2.6.2)
WebService
package com.test.foo;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
@WebService(
serviceName = "FooService",
name = "Foo"
)
public class FooWS {
@WebMethod
public Foo getFoo(
@WebParam(header = true, name = "context") String
context,
@WebParam(name = "arg") String arg
) {
return new Foo("hello");
}
}
then java ->wsdl
java2ws.bat -wsdl -cp . com.test.foo.FooWS
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="FooService" targetNamespace="http://foo.test.com/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="http://foo.test.com/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
<wsdl:types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://foo.test.com/" attributeFormDefault="unqualified"
elementFormDefault="unqualified" targetNamespace="http://foo.test.com/">
<xs:element name="getFoo" type="tns:getFoo"/>
<xs:element name="getFooResponse" type="tns:getFooResponse"/>
<xs:complexType name="getFoo">
<xs:sequence>
<xs:element minOccurs="0" name="arg" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="getFooResponse">
<xs:sequence>
<xs:element minOccurs="0" name="return" type="tns:foo"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="foo">
<xs:sequence>
<xs:element minOccurs="0" name="str" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="context" nillable="true" type="xs:string"/>
</xs:schema>
</wsdl:types>
<wsdl:message name="getFooResponse">
<wsdl:part name="parameters" element="tns:getFooResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getFoo">
<wsdl:part name="parameters" element="tns:getFoo">
</wsdl:part>
<wsdl:part name="context" element="tns:context">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="Foo">
<wsdl:operation name="getFoo">
<wsdl:input name="getFoo" message="tns:getFoo">
</wsdl:input>
<wsdl:output name="getFooResponse" message="tns:getFooResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="FooServiceSoapBinding" type="tns:Foo">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getFoo">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="getFoo">
<soap:header message="tns:getFoo" part="context" use="literal">
</soap:header>
<soap:body parts="parameters" use="literal"/>
</wsdl:input>
<wsdl:output name="getFooResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="FooService">
<wsdl:port name="FooPort" binding="tns:FooServiceSoapBinding">
<soap:address location="http://localhost:9090/FooPort"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
you can see that order of parameters have changed
<wsdl:message name="getFoo">
<wsdl:part name="parameters" element="tns:getFoo">
</wsdl:part>
<wsdl:part name="context" element="tns:context">
</wsdl:part>
</wsdl:message>
then java → wsdl
wsdl2java.bat FooService.wsdl
now SEI looks like
package com.test.foo;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.xml.bind.annotation.XmlSeeAlso;
/**
* This class was generated by Apache CXF 2.6.2
* 2012-11-01T12:09:35.926+04:00
* Generated source version: 2.6.2
*
*/
@WebService(targetNamespace = "http://foo.test.com/", name = "Foo")
@XmlSeeAlso({ObjectFactory.class})
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
public interface Foo {
@WebResult(name = "getFooResponse", targetNamespace =
"http://foo.test.com/", partName = "parameters")
@WebMethod
public GetFooResponse getFoo(
@WebParam(partName = "parameters", name = "getFoo", targetNamespace
= "http://foo.test.com/")
GetFoo parameters,
@WebParam(partName = "context", name = "context", targetNamespace =
"http://foo.test.com/", header = true)
java.lang.String context
);
}
you can see that order of parameters have changed.
Is it a bug or feature ? How can I manage order of parameters? Are there any
workarounds?
--
View this message in context:
http://cxf.547215.n5.nabble.com/WebParam-header-true-and-it-s-place-in-generated-SEI-tp5717680.html
Sent from the cxf-user mailing list archive at Nabble.com.