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

Reply via email to