Maven jax-ws plugin wsimport giving "The nested type x cannot hide an enclosing type" in generated code

2k views Asked by At

Detail:

  • Maven - 3.3.1 with jaxws-maven-plugin version 2.3 and goal wsimport on a wsdlUrl that I can't paste here.
  • Java 1.7

Example maven pom content:

<plugin>
                <groupId>org.jvnet.jax-ws-commons</groupId>
                <artifactId>jaxws-maven-plugin</artifactId>
                <version>2.3</version>
                <executions>
                    <execution>
                        <id>wsdla-exec-1</id>
                        <goals>
                            <goal>wsimport</goal>
                        </goals>
                        <configuration>
                            <packageName>com.yourcompany.package</packageName>
                            <target>2.1</target>
                            <verbose>true</verbose>
                            <!-- Fix naming resolution due to ChangeOrderResponse duplicate stanza -->
                            <args>
                                <arg>-B-XautoNameResolution</arg>
                            </args>
                            <wsdlDirectory>src/main/resources</wsdlDirectory>
                            <wsdlFiles>
                                <wsdlFiles>service1.wsdl</wsdlFiles>
                            </wsdlFiles>
                            <wsdlLocation>/*</wsdlLocation>
                            <sourceDestDir>src/main/java</sourceDestDir>
                        </configuration>
                    </execution>
                    <execution>
                        <id>wsdla-exec-2</id>
                        <goals>
                            <goal>wsimport</goal>
                        </goals>
                        <configuration>
                            <packageName>com.yourcompany.package</packageName>
                            <target>2.1</target>
                            <verbose>true</verbose>
                            <!-- Fix naming resolution due to ChangeOrderResponse duplicate stanza -->
                            <args>
                                <arg>-B-XautoNameResolution</arg>
                            </args>
                            <wsdlDirectory>src/main/resources</wsdlDirectory>
                            <wsdlFiles>
                                <wsdlFile>service2.wsdl</wsdlFile>
                            </wsdlFiles>
                            <wsdlLocation>/*</wsdlLocation>
                            <sourceDestDir>src/main/java</sourceDestDir>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

Description:

I have been generating client code from wsdl's for quite some time now within Mule and it has always been fairly straight forward and productive but now I've hit a snag for which I might get a pointer in the right direction here.

Basically, in the generated code from the wsdl there is a nested class of the same name as the container class and this is producing the colour red in my projects where I'm using this wsdl.

What I know:

I can change the code manually and viola, or better yet I can change the wsimport to use a static file (copied from the url - incl all the xsd's) and change those files. However both seem wrong!

Is there a way I can manipulate the process of code generation or should I ask the vendor to make changes? What are your thoughts?

Many thanks, truly appreciate any input.

1

There are 1 answers

0
RSwan On BEST ANSWER

The answer lied in the fact that the vendor actually intended consumers to use xmlbeans for bindings and not jaxb as per the current jax-ws standard. So in order to create client code from the wsdl I was able to do either one of the following.

On windows (if you have the tool):

md YourServiceFolderName
WSDL2java -uri YourService.wsdl -ss -sd -ssi -g -d xmlbeans -o YourServiceFolderName

With Maven plugin, under your "plugins" tag (be sure to sort out the dependancies you'll need as well - not given here):

            <plugin>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-codegen-plugin</artifactId>
            <version>2.7.8</version>
            <executions>
                <execution>
                    <id>generate-sources</id>
                    <phase>generate-sources</phase>
                    <configuration>
                        <wsdlOptions>
                            <wsdlOption>
                                <wsdl>YourService?wsdl</wsdl>
                                <extraargs>
                                    <extraarg>-databinding</extraarg>
                                    <extraarg>xmlbeans</extraarg>
                                </extraargs>
                            </wsdlOption>
                    </configuration>
                    <goals>
                        <goal>wsdl2java</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

This should give you all the java artefacts you need to get on with your service consumption. Hope this helps someone.