If have a rather large schema that is used in several webservices, therefore I want to separate XSD compilation from WSDL compilation. In a simplified example, compiling in a single step works:
$ wsimport -verbose service.wsdl parsing WSDL... Generating code... org/example/wsdl/mysvc/MySvcPortType.java org/example/wsdl/mysvc/MySvcService.java org/example/ns1/Element1.java org/example/ns1/ObjectFactory.java org/example/ns1/package-info.java ...
Compiling the xsd and using the resulting episode file does not work:
$ wsimport -b schema3.episode service.wsdl parsing WSDL... [ERROR] Schema descriptor {http://www.example.org/ns1}element1 in message part "part1" is not defined and could not be bound to Java. Perhaps the schema descriptor {http://www.example.org/ns1}element1 is not defined in the schema imported/included in the WSDL. You can either add such imports/includes or run wsimport and provide the schema location using -b switch. line 9 of file:...jaxepisode_element/service.wsdl
So how can I use the precompiled schema in wsimport?
Addendum: Using the episode when including in another schema works and avoids new compilation (d3.jar contains the genrated classes from schema3 + schema3.episode as META-INF/sun-jaxb.episode):
$ xjc schema4.xsd d3.jar -extension parsing a schema... compiling a schema... org/example/ns2/Element2.java org/example/ns2/ObjectFactory.java org/example/ns2/package-info.java
Without the precompiled package:
$ xjc schema4.xsd -extension parsing a schema... compiling a schema... org/example/ns1/Element1.java org/example/ns1/ObjectFactory.java org/example/ns1/package-info.java org/example/ns2/Element2.java org/example/ns2/ObjectFactory.java org/example/ns2/package-info.java
WSDL:
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://example.org/wsdl/MySvc" xmlns:ns="http://www.example.org/ns1" targetNamespace="http://example.org/wsdl/MySvc" name="MySvc"> <types> <xsd:schema> <xsd:import namespace="http://www.example.org/ns1" schemaLocation="schema3.xsd"/> </xsd:schema> </types> <message name="myOpRequest"> <part name="part1" element="ns:element1"/> </message> <message name="myOpReply"> <part name="part1" element="ns:element1"/> </message> <portType name="MySvcPortType"> <operation name="myOp"> <input name="input1" message="tns:myOpRequest"/> <output name="output1" message="tns:myOpReply"/> </operation> </portType> <binding name="MySvcBinding" type="tns:MySvcPortType"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="myOp"> <soap:operation/> <input name="input1"> <soap:body use="literal"/> </input> <output name="output1"> <soap:body use="literal"/> </output> </operation> </binding> <service name="MySvcService"> <port name="MySvcPort" binding="tns:MySvcBinding"> <soap:address location="http://localhost:8080/"/> </port> </service> </definitions>
schema3.xsd:
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/ns1" xmlns:tns="http://www.example.org/ns1" elementFormDefault="qualified"> <element name="element1" > <complexType > <sequence> <element name="name" type="string" /> </sequence> </complexType> </element> </schema>
schema4.xsd:
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/ns2" xmlns:tns="http://www.example.org/ns2" xmlns:ns1="http://www.example.org/ns1" elementFormDefault="qualified"> <import namespace="http://www.example.org/ns1" schemaLocation="schema3.xsd"/> <element name="element2" > <complexType > <sequence> <element ref="ns1:element1" /> </sequence> </complexType> </element> </schema>
The generated episode file:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <bindings version="2.1" xmlns="http://java.sun.com/xml/ns/jaxb"> <bindings scd="x-schema::tns" xmlns:tns="http://www.example.org/ns1"> <schemaBindings map="false"> <package name="org.example.ns1"/> </schemaBindings> <bindings scd="tns:element1"> <class ref="org.example.ns1.Element1"/> </bindings> </bindings> </bindings>
You can use maven, separate for each and Generate with Apache CXF.
I have an example that can help you.
properties:
<properties> <apache.cxf.version>3.0.4</apache.cxf.version> <cxf-codegen-plugin.version>3.0.4</cxf-codegen-plugin.version> <cxf-xjc-plugin.version>3.0.3</cxf-xjc-plugin.version> </properties>
dependencies:
<dependencies> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>${apache.cxf.version}</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>${apache.cxf.version}</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-databinding-jaxb</artifactId> <version>${apache.cxf.version}</version> <exclusions> <exclusion> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> </exclusion> <exclusion> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> </exclusion> <exclusion> <groupId>xalan</groupId> <artifactId>xalan</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
Run --> mvn clean install -Pgenerates-nfe-services
<profile> <id>generates-nfe-services</id> <activation> <property> <name>generates-nfe-services</name> </property> </activation> <build> <plugins> <plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-codegen-plugin</artifactId> <executions> <execution> <id>generate-sources</id> <phase>generate-sources</phase> <configuration> <!--sourceRoot>${project.build.directory}/generated-sources</sourceRoot--> <sourceRoot>${basedir}/src/main/java</sourceRoot> <defaultOptions> <extraargs> <extraarg>-validate</extraarg> <extraarg>-client</extraarg> <extraarg>-verbose</extraarg> <extraarg>-xjc-npa</extraarg> <extraarg>-xjc-verbose</extraarg> <extraarg>-xjc-extension</extraarg> <extraarg>-exsh</extraarg> <extraarg>true</extraarg> <extraarg>-keep</extraarg> </extraargs> </defaultOptions> <wsdlOptions> <wsdlOption> <wsdl> ${basedir}/src/main/wsdl/br/gov/rs/sefaz/nfe/homologacao/NfeConsultaCadastro.wsdl </wsdl> <extraargs> <extraarg>-p</extraarg> <extraarg>br.gov.rs.sefaz.nfe.consulta.cadastro</extraarg> </extraargs> </wsdlOption> </wsdlOptions> </configuration> <goals> <goal>wsdl2java</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </profile>
Run --> mvn clean install -Pgenerates-layouts-nfe
<profile> <id>generates-layouts-nfe</id> <activation> <property> <name>generates-layouts-nfe</name> </property> </activation> <build> <plugins> <plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-xjc-plugin</artifactId> <version>${cxf-xjc-plugin.version}</version> <executions> <execution> <id>generate-sources</id> <phase>generate-sources</phase> <goals> <goal>xsdtojava</goal> </goals> <configuration> <!--sourceRoot>${basedir}/target/generated-sources</sourceRoot--> <sourceRoot>${basedir}/src/main/java</sourceRoot> <xsdOptions> <xsdOption> <xsd>${basedir}/src/main/schemas/nfe/PL_008f/leiauteConsSitNFe_v3.10.xsd </xsd> <packagename>br.inf.portalfiscal.nfe.v310.leiaute.consulta.situacao.nfe </packagename> <extension>true</extension> <extensionArgs> <!--extensionArg>-npa</extensionArg--> <extensionArg>-extension</extensionArg> </extensionArgs> </xsdOption> </xsdOptions> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile>
You can create a maven project to generate only the wsdl and another to only generate the xsd.
NOTE:
If his project does not require use the WSDL, switch to the json-rest-api.
Use REST and be happy. \o/
I hope this helps.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With