Hi,
You can resolve this problem by creating a custom binding
configuration to change the class name.

For example, you create mybinding.xml file that looks like:

<jaxws:bindings version="1.0"
  xmlns:jaxws="http://java.sun.com/xml/ns/jaxws";
  xmlns:jaxb="http://java.sun.com/xml/ns/jaxb";
  xmlns:xs="http://www.w3.org/2001/XMLSchema";
  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/";  >
  <jaxws:bindings wsdlLocation="mywsdl.wsdl">
    <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema">
      <jaxb:bindings
node="xs:element[@name='responseClass']/xs:complexType/xs:sequence/xs:element[@name='responseData']/xs:complexType/xs:sequence/xs:element[@name='data']/xs:complexType/xs:sequence/xs:element[@name='data']/xs:complexType">
        <jaxb:class name="SecondData"/>
      </jaxb:bindings>
    </jaxws:bindings>
  </jaxws:bindings>
</jaxws:bindings>

Basically, the idea is to match the complex type associated with the
second data element and rename its associated class to SecondData.

When you use this binding file to generate classes from your wsdl
file, you will resolve the naming conflict .

For example, if you are using cxf-codegen-plugin, you can add the
bindingFiles entry in your pom as:
    ...
   <wsdlOption>
     <wsdl>${basedir}/...../mywsdl.wsdl</wsdl>
     <bindingFiles>
      <bindingFile>${basedir}/..../mybinding.xml</bindingFile>
      </bindingFiles>

Alternatively, if you can modify the wsdl/schema itself, you can make
one of the inner types to a top-level type with a distinct name. In
this case, you won't need the binding file to change the class name.

Regards, Aki

2011/4/13 Brian Hayward <[email protected]>:
> I'm trying to use an existing wsdl published by someone else and am
> having compilation issues when using the CXF maven plugin (2.3.3) when
> a child element has the same as a parent.
>
> Example scenario:
>
>                           <xs:schema>
>                                   <xs:element name="responseClass">
>                                       <xs:complexType>
>                                            <xs:sequence>
>                                                <xs:element
> minOccurs="0" name="responseData">
>                                                        <xs:complexType>
>                                                                <xs:sequence>
>
>  <xs:element maxOccurs="unbounded" name="data">
>
>         <xs:complexType>
>
>                 <xs:sequence>
>
>                         <xs:element name="data">
>
>                                 <xs:complexType>
> .....etc
>
>
> It will generate a java file named: "ResponseClass.java"
> The class structure will be:
> public class ResponseClass
>    |
>    --> public static class ResponseData
>            |
>            --> public static class Data
>                     |
>                     --> public static class Data
>
> This will fail to compile with the following error:
>
> ResponseClass.java:[652,26]
> com.mypackage.ResponseClass.ResponseData.Data is already defined in
> com.mypackage.ResponseClass.ResponseData
>
> Renaming the second (child) "data" element to something else fixes the 
> problem.
>
> Any thoughts or work-arounds?
>
> Thanks,
> Brian
>

Reply via email to