Would this qualify as an issue? And if so, should I rather log it on JIRA for it to be tracked?
On Sat, Aug 4, 2012 at 10:01 AM, Hannes Holtzhausen <[email protected]> wrote: > I am using the Apache CXF 2.3.11 java2ws tool to generate WSDL > documents using the following configuration: > > * JAX-WS frontend > * XMLBeans databinding > > I decided to upgrade the tool chain to make use of CXF 2.6.1 using the > same configuration as above. Unfortunately > java2ws now generates duplicate elements in the "service" schema of > the WSDL. Below is the process I follow: > > 1. Define schema: > > * Header schema: > > <xsd:schema > xmlns:xsd="http://www.w3.org/2001/XMLSchema" > xmlns:hdr="http://javatoolbox.sf.net/services/util/header/beans" > > targetNamespace="http://javatoolbox.sf.net/services/util/header/beans" > elementFormDefault="qualified"> > > <xsd:complexType name="ServiceHeader"> > <xsd:sequence> > ... > </xsd:sequence> > </xsd:complexType> > ... > </xsd:schema> > > > * Message schema: > > <?xml version="1.0" encoding="UTF-8" ?> > <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" > xmlns:mep="java:mep.service.data" > targetNamespace="java:mep.service.data" > elementFormDefault="qualified"> > > <xsd:complexType name="InputData"> > <xsd:sequence> > <xsd:sequence> > ... > </xsd:sequence> > </xsd:complexType> > ... > </xsd:schema> > > XMLBeans is used to generate an API from the schema documents. > > > 2. Define Java interface with JAX-WS annotations: > > @WebService(name = "MEPService", > serviceName = "MEPService", > targetNamespace = "java:mep.service") > public interface MEPService > { > > @WebMethod (action = "sayHello") > @WebResult (name = "OutputData", > targetNamespace = "java:mep.service") > public OutputData sayHello( > @WebParam (name = "InputData", > targetNamespace = "java:mep.service") > InputData input, > @WebParam ( > name = "ServiceHeader", > > targetNamespace="http://javatoolbox.sf.net/services/util/header/beans", > header= true) > Holder<ServiceHeader> header) throws MEPServiceException; > } > > The important thing to note here is that I am defining the "InputData" > WebParam in the "service" namespace, while the "ServiceHeader" > WebParam is referenced using the element's namespace as it was defined > in the header schema document above. > > 3. Execute java2ws: > > I execute java2ws as follows: > /opt/asf/cxf23/java2ws -databinding xmlbeans -frontend jaxws -wsdl -o > mepService.cxf23_b.wsdl -cp mep_service.jar:mep_data.jar: -d . > mep.service.MEPService > > /opt/asf/cxf26/java2ws -databinding xmlbeans -frontend jaxws -wsdl -o > mepService.cxf23_a.wsdl -cp mep_service.jar:mep_data.jar: -d . > mep.service.MEPService > > > Output: > > With CXF 2.3 the the "service" schema in the WSDL only contains > element definitions for InputData and OutputData e.g: > > <xsd:element name="sayHello" type="tns:sayHello"/> > <xsd:complexType name="sayHello"> > <xsd:sequence> > <xsd:element form="qualified" minOccurs="0" name="InputData" > type="ns0:InputData"/> > </xsd:sequence> > </xsd:complexType> > <xsd:element name="sayHelloResponse" type="tns:sayHelloResponse"/> > <xsd:complexType name="sayHelloResponse"> > <xsd:sequence> > <xsd:element form="qualified" minOccurs="0" name="OutputData" > type="ns0:OutputData"/> > </xsd:sequence> > </xsd:complexType> > > And the ServiceHeader element is only referenced in the WSDL messages e.g: > > <wsdl:message name="sayHello"> > <wsdl:part name="parameters" element="tns:sayHello"> > </wsdl:part> > <wsdl:part name="ServiceHeader" element="ns1:ServiceHeader"> > </wsdl:part> > </wsdl:message> > > With CXF 2.6, in addition to the InputData and OutputData elements, > additional elements (one for each input and output complexType) are > defined in the "service" schema > based on the ServiceHeader type e.g: > > <xsd:element name="ServiceHeader" type="ns1:ServiceHeader"/> > > <xsd:element name="sayHello" type="tns:sayHello"/> > <xsd:complexType name="sayHello"> > <xsd:sequence> > <xsd:element form="qualified" minOccurs="0" name="InputData" > type="ns0:InputData"/> > </xsd:sequence> > </xsd:complexType> > > <xsd:element name="ServiceHeader" type="ns1:ServiceHeader"/> > > <xsd:element name="sayHelloResponse" type="tns:sayHelloResponse"/> > <xsd:complexType name="sayHelloResponse"> > <xsd:sequence> > <xsd:element form="qualified" minOccurs="0" name="OutputData" > type="ns0:OutputData"/> > </xsd:sequence> > </xsd:complexType> > > You can clearly see the "service" schema now contains additional > ServiceHeader element definitions and they are duplicated. > > The ServiceHeader element is still referenced correctly in the WSDL > messages as before. > > > Questions/Problems: > > 1. Why is CXF 2.6.1 generating a ServiceHeader in the "service" > schema? This was not the default behaviour of 2.3 even though > the 2.6.1 behaviour is more consistent with what the > ServiceFactories do by default. > > 2. The 2.6.1 generated WSDL's (even though they would contain > ServiceHeader elements that would never be used) would still > be valid if only 1 ServiceHeader element definition was added to > the service schema. The current situation however causes schema > validation to fail with a "Duplicate Key" exception, because > ServiceHeader is defined multiple times in the same namespace. > > 3. Is there anything I can do from a configuration perspective to > restore the 2.3 behaviour in 2.6.1? > > Hannes
