2016-08-15 1 views
0

Ich verwende JAXB, um Klassen aus meiner XSD-Datei zu generieren. Ich möchte, dass die generierten Klassen eine gemeinsame Schnittstelle implementieren. Also probiere ich das JAXB2 Basics Plugin mit dem external binding file Ansatz aus. Dies ist meine benutzerdefinierte Bindung Datei:JAXB2 Basics Plugins - Problem mit schemaLocation in meiner externen Bindungsanpassungsdatei

customBindingFile.xjb

<?xml version="1.0"?> 
<jxb:bindings version="1.0" 
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
    xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance" 
    jxb:extensionBindingPrefixes="xjc"> 

    <jxb:bindings schemaLocation="abc-api.xsd"> 
     <jxb:bindings node="//xs:complexType[@name='MyClass']"> 
     <inheritance:implements>com.kuldeep.CommonInterface</inheritance:implements> 
     </jxb:bindings> 
    </jxb:bindings> 
</jxb:bindings> 

Es folgt mein Maven Plugin in pom-Datei für Quelle Generation: Hinweis Kommentar von mir hinzugefügt wird die Änderung, die ich gemacht dieser vorhandene Plugin-Eintrag.

pom.xml

<plugin> 
    <groupId>org.apache.cxf</groupId> 
    <artifactId>cxf-codegen-plugin</artifactId> 
    <version>${cxf.plugin.version}</version> 
    <executions> 
    <execution> 
     <id>generate-sources</id> 
     <phase>generate-sources</phase> 
     <configuration> 

     <!-- **extensions and args added by me** --> 
     <extensions> 
      <extension>org.jvnet.jaxb2_commons:jaxb2-basics:0.9.2</extension> 
     </extensions> 
     <args> 
      <arg>-Xinheritance</arg> 
     </args> 


     <sourceRoot>${project.build.directory}/generated/cxf</sourceRoot> 
     <defaultOptions> 
      <bindingFiles> 
      <bindingFile>src/main/resources/jaxws_binding.xml</bindingFile> 
      <bindingFile>src/main/resources/jaxb_binding.xml</bindingFile> 
      </bindingFiles> 
     </defaultOptions> 
     <wsdlOptions> 
      ...... 
      <wsdlOption> 
      <wsdl>${project.build.directory}/generated/framework/cxf/abc-api-inline.wsdl</wsdl> 

      <!-- **bindingFile added by me** --> 
      <bindingFile>src/main/resources/customBindingFile.xjb</bindingFile> 

      </wsdlOption> 
     </wsdlOptions> 
     </configuration> 
     <goals> 
     <goal>wsdl2java</goal> 
     </goals> 
    </execution> 
    </executions> 

    <!-- **dependency added by me** --> 
    <dependencies> 
    <dependency> 
     <groupId>org.jvnet.jaxb2_commons</groupId> 
     <artifactId>jaxb2-basics</artifactId> 
     <version>0.9.2</version> 
    </dependency> 
    </dependencies> 

</plugin> 

Das Problem, das ich habe, ist meine Schemadatei abc-api.xsd in einem anderen Projekt befindet, so dass, wenn ich versuche, meine Klassen zu tun Maven installieren zu erzeugen Ich erhalte die Fehlermeldung abc-api.xsd ist kein Teil dieser Zusammenstellung.

[ERROR] Failed to execute goal org.apache.cxf:cxf-codegen-plugin:3.0.3:wsdl2java (generate-sources) on project : Execution generate-sources of goal org.apache.cxf:cxf-codegen-plugin:3.0.3:wsdl2java failed: file:/I:/project/src/main/resources/customBindingFile.xjb [9,56]: "file:/I:/project/src/main/resources/abc-api.xsd" is not a part of this compilation. Is this a mistake for "file:/I:/project/src/main/resources/jaxb_binding.xml"? -> [Help 1]

Und wenn ich das schema Attribut aus customBindingFile.xjb entfernen es funktioniert nicht und gibt Fehler:

XPath evaluation of "//xs:complexType[@name='MyClass']" results in empty target node

Also meine Frage ist, wie kann ich die bestimmten Schema Dateinamen vermeiden Bereitstellung/Position in customBindingFile.xjb und es einfach auf was auch immer xsd angewendet wird, um die Klassen zu generieren.

Antwort

0

Mit Hilfe unseres Architekten konnte ich dieses Problem lösen. Ich fügte eine Jaxws-Bindedatei hinzu und verwendete dort eine Präfix-lose xpath-Abfrage, um meinen Anfrageelementen zu entsprechen. Auf diese Weise muss ich den Speicherort des Schemas nirgendwo angeben und wird auf der Grundlage der XPath-Abfrage auf die spezifische WSDL angewendet.

jaxws_binding_inheritance.xml

<jaxws:bindings version="2.0" xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
    xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance" jaxb:extensionBindingPrefixes="inheritance xjc" 
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1"> 

    <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle> 

    <jaxws:bindings 
    node="*[local-name()='definitions']/*[local-name()='types']/*[local-name()='schema' and 
      (@targetNamespace='urn:net:mycompany:api:abc')]"> 

    <jaxb:bindings 
     node="//*[local-name()='element' and 
      not(@name = 'ExcludeThisRequest' or @name = 'AlsoExcludeThisRequest') and 
      (substring(@name, string-length(@name) - string-length('Request') +1) = 'Request')]/*[local-name()='complexType']"> 
     <inheritance:implements>com.kuldeep.CommonRequest</inheritance:implements> 
    </jaxb:bindings> 

    </jaxws:bindings> 
</jaxws:bindings> 

Und fügte hinzu, dass jaxws Datei (jaxws_binding_inheritance.xml) unter wsdloption für die Wsdl Bindung wo ich das anwenden wollte.

pom.xml

<wsdlOption> 
    <wsdl>${project.build.directory}/generated/framework/cxf/abc-api-inline.wsdl</wsdl> 
    <bindingFiles> 
    <bindingFile>src/main/resources/jaxws_binding_inheritance.xml</bindingFile> 
    </bindingFiles> 
</wsdlOption>