JAXB Binding for XSD outside WSDL

2019-05-07 12:57发布

问题:

We are generating java with wsdl2java from third party WSDL (means we cant modify him). WSDL contain:

<wsdl:import namespace="http://somenamespace" location="xsdschema.xsd" /> 

In this xsdschema are elements with nillable="true" and generator reports conflicts (duplications) in ObjectFactory. We try to use binding generateElementProperty="false". But in binding definition that is defined for WSDL, generator ignores it, and when defining bindings for xsd WSDL2Java said, that the XSD is not part of compilation. How to solve it?

XJB for WSDL (generateElementProperty is ignored - still duplication error in ObjectFactory):

<jaxws:bindings version="2.0"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
  xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
  xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
               wsdlLocation="wsdl3rd.wsdl">

    <jaxb:bindings>
        <jaxb:globalBindings generateElementProperty="false"/>
    </jaxb:bindings>
</jaxws:bindings>

XJB for XSD (error: XSD is not part of compilation):

<jxb:bindings version="2.1" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <jxb:bindings schemaLocation="xsdschema.xsd">
        <jxb:bindings>
          <jxb:globalBindings generateElementProperty="false"/>
        </jxb:bindings>
    </jxb:bindings>
</jxb:bindings> 

Maven:

            <plugin>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-codegen-plugin</artifactId>
                <version>${cxf.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>wsdl2java</goal>
                        </goals>
                        <configuration>
                            <wsdlRoot>src/main/resources/wsdl</wsdlRoot>
                            <defaultOptions>
                                <bindingFiles>bindingFile>bindingFile.xjb</bindingFile>
                                </bindingFiles>
                            </defaultOptions>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

回答1:

I suggest you this strategy....

use this config to generate the API and exclude the XSD classes

<plugin>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-codegen-plugin</artifactId>
    <version>${cxf.version}</version>
    <executions>
        <execution>
            <id>generate-sources</id>
            <phase>generate-sources</phase>
            <configuration>
                <wsdlOptions>
                    <wsdlOption>
                        <wsdl>${basedir}/pathOfYourWSDL.wsdl</wsdl>
                        <extraargs>
                            <extraarg>-nexclude</extraarg>
                            <extraarg>http://somenamespace</extraarg>                                   
                        </extraargs>
                    </wsdlOption>                           
                </wsdlOptions>
            </configuration>
            <goals>
                <goal>wsdl2java</goal>
            </goals>
        </execution>
    </executions>
</plugin>

use this plugin to generate the XSD classes with binding configuration

           <plugin>
                <groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb2-plugin</artifactId>
                <version>0.8.1</version>
                <executions>
                    <execution>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <args>
                        <arg>-Xannotate</arg>
                        <arg>-nv</arg>
                    </args>
                    <extension>true</extension>
                    <forceRegenerate>true</forceRegenerate>
                    <bindingDirectory>${basedir}/pathOfYourXJB</bindingDirectory>
                    <bindingIncludes>
                        <include>yourXJB.xjb</include>
                    </bindingIncludes>
                    <schemas>
                        <schema>
                            <fileset>
                                <directory>${basedir}/pathOfYourXSD</directory>
                                <includes>
                                    <include>yourXSD.xsd</include>
                                </includes>
                            </fileset>
                        </schema>
                    </schemas>
                    <debug>true</debug>
                    <verbose>true</verbose>
                    <plugins>
                        <plugin>
                            <groupId>org.jvnet.jaxb2_commons</groupId>
                            <artifactId>jaxb2-basics</artifactId>
                            <version>0.6.2</version>
                        </plugin>
                        <plugin>
                            <groupId>org.jvnet.jaxb2_commons</groupId>
                            <artifactId>jaxb2-basics-annotate</artifactId>
                            <version>0.6.2</version>
                        </plugin>
                    </plugins>
                </configuration>
            </plugin>

use this plugin to add resources

<plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <version>1.1</version>
                <executions>
                    <execution>
                        <id>add-source</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>add-source</goal>
                        </goals>
                        <configuration>
                            <sources>
                                <source>target/generated-sources/xjc</source>
                                <source>target/generated-sources/cxf</source>
                            </sources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

I used this strategy to divide the data model from APIs