2016-05-09 16 views
0

Ich versuche, JAVA-Code mit Jaxb und Feder zu generieren, aber ich kann es nicht funktionieren, wenn ich als WSDL-Datei mit 2 SimpleTypes mit dem gleichen Namen, aber in verschiedenen Namespaces . Weiß jemand wie ich das lösen kann?XJB und JAXB Bindung auf SimpleType mit dem gleichen Namen

Ich habe das jaxb:factoryMethod Tag ausprobiert, aber ich kann die Syntax nicht richtig erhalten. Aber vielleicht gibt es einen einfacheren Weg?

binding.xjb

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<jaxb:bindings 
    xmlns:jaxb="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:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:annox="http://annox.dev.java.net" 
    xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd" 
    jaxb:extensionBindingPrefixes="xjc annox" 
    version="2.1" 
    targetNamespace="http://com.company/generated" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> 

<jaxb:globalBindings> 
</jaxb:globalBindings> 

<jaxb:bindings 
     node="/wsdl:definitions/wsdl:types/xs:schema[namespace::*[.='http://com.company/storetaxinformation']]/xs:simpleType[@name='TypeOfTax']" 
     schemaLocation="../../../target/classes/disb.wsdl"> 
    <annox:annotateClass>@javax.xml.bind.annotation.XmlRootElement(name="TypeOfTaxStoreTax")</annox:annotateClass> 
</jaxb:bindings> 

<jaxb:bindings 
     node="/wsdl:definitions/wsdl:types/xs:schema[namespace::*[.='http://com.company/gettaxinformation']]/xs:simpleType[@name='TypeOfTax']" 
     schemaLocation="../../../target/classes/disb.wsdl"> 
    <annox:annotateClass>@javax.xml.bind.annotation.XmlRootElement(name="TypeOfTaxInfo")</annox:annotateClass> 
</jaxb:bindings> 
</jaxb:bindings> 

error.log

[ERROR] Error while generating code.Location [ file:/C:/wsdl/disb.wsdl{49,52}]. 
     com.sun.istack.SAXParseException2; systemId: file:/C:/wsdl/disb.wsdl; 
     lineNumber: 49; columnNumber: 52; Two declarations cause a collision in the ObjectFactory class. 

Antwort

0

Wir haben das jetzt gelöst und es war das <generatePackage> Element, das einen Teil des Problems verursachte. Wir haben auch sichergestellt, dass jedes Schema/Namespace an sein eigenes Paket gebunden wird. Auf diese Weise beschweren sich die ObjectFactory-Klassen nicht.

pom.xml

... 
<plugin> 
    <groupId>org.jvnet.jaxb2.maven2</groupId> 
    <artifactId>maven-jaxb2-plugin</artifactId> 
    <version>0.12.3</version> 
    <executions> 
     <execution> 
     <id>generate-sources-servicename</id> 
     <goals> 
      <goal>generate</goal> 
     </goals> 
     <configuration> 
      <schemaLanguage>WSDL</schemaLanguage> 
      <!-- see binding.xjb 
      <generatePackage>com.company.generated</generatePackage> 
      --> 
      <extension>true</extension> 
      <forceRegenerate>true</forceRegenerate> 
      <bindingIncludes> 
... 

binding.xjb

<jaxb:bindings schemaLocation="../../../target/classes/disb.wsdl" 
    node="/wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='http://com.company/generated/storetax']" > 
    <jaxb:schemaBindings> 
     <jaxb:package name="com.company.generated.storetax"></jaxb:package> 
    </jaxb:schemaBindings> 
</jaxb:bindings> 

<jaxb:bindings schemaLocation="../../../target/classes/disb.wsdl" 
    node="/wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='http://com.company/storeaccount']" > 
    <jaxb:schemaBindings> 
     <jaxb:package name="com.company.generated.storeaccount"></jaxb:package> 
    </jaxb:schemaBindings> 
</jaxb:bindings> 
0

Nein, @XmlRootElement nicht helfen. Es geht um Methodennamen in ObjectFactory.

Sind Sie sicher, dass es einfache Typen sind, die eine Kollision verursachen? XJC zeigt in die ObjectFactory Verfahren aus, so sollte es global elments, nicht einfache Typen

Hier ist ein Beispiel für die factoryMethod Anpassung:

<jaxb:bindings 
    schemaLocation="http://schemas.opengis.net/citygml/texturedsurface/1.0/texturedSurface.xsd" 
    node="/xs:schema"> 
    <jaxb:bindings node="xs:element[@name='_Appearance']"> 
     <jaxb:factoryMethod name="AAppearance"/> 
    </jaxb:bindings> 
</jaxb:bindings> 

Sie finden ein, welche Elemente finden müssen heraus verursachen Kollision und anpassen sie. Nicht die einfachen Typen.