JAXB Binding for XSD outside WSDL

∥☆過路亽.° 提交于 2019-12-07 07:05:11

问题


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



来源:https://stackoverflow.com/questions/25687186/jaxb-binding-for-xsd-outside-wsdl

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!